*! outreg2 2.2.4 12apr2010 by roywada@hotmail.com
*! based on outreg 3.0.6/4.0.0 by john_gallup@alum.swarthmore.edu

prog define outreg2, by(onecall) sortpreserve
	versionSet
	version `version'

*** per Richard W., store the currently active estimates to be restored later
tempname coefActive
* capture for prior to Stata 8.2
cap _estimates hold `coefActive', restore copy nullok

* getting the colon : parsings
/* not version 7 friendly
_on_colon_parse `0'
local 0 `"`s(before)'"'
local rest `"`s(after)'"'
outreg2 : `"`rest'"' if `touse'==1 */

if "`Version7'"=="" {
	local bind ""
}
else {
	local bind "bind"
}

local behind `"`0'"'
local 0 ""
gettoken front behind: behind, parse(" ,")
local 0 ""
local done 0
while `"`front'"'~="" & `done'==0 {
	if `"`front'"'=="using" {
		
		gettoken rest behind: behind, parse(" ,")
		* strip off quotes
		gettoken first second: rest, parse(" ")
		cap local rest: list clean local(rest)
		
		* take off colon at the end
		local goldfish ""
		if index(`"`rest'"',":")~=0 {
			local end=substr(`"`rest'"',length(`"`rest'"'),length(`"`rest'"'))
			if "`end'"==":" {
				local rest=substr(`"`rest'"',1,`=length(`"`rest'"')-1')
				local goldfish " : "
			}
		}
		
		* colon reattached with a space at the end
		* .txt attached here for seeout working with _pref.ado
		local rabbit `"""'
		if index(`"`rest'"', ".")==0 {
			local using `"`rabbit'`rest'.txt`rabbit'`goldfish'"'
		}
		else {
			local using `"`rabbit'`rest'`rabbit'`goldfish'"'
		}
		local 0 `"`0' using `using' `behind'"'
		local done 1
	}
	else {
		local 0 `"`0' `front'"'
		gettoken front behind: behind, parse(" ,")
	}
}


gettoken first second : 0, parse(":") `bind' match(par) quotes
local 0 `"`first'"'
while `"`first'"'~=":" & `"`first'"'~="" {
	gettoken first second : second, parse(":") `bind' match(par) quotes
}
if `"`0'"'==":" {
	* colon only when shorthand combined with prefix
	local 0
}
else {
	local _0 `"`0'"'
}


*** shorthand syntax if [using] is missing
syntax [anything] [using] [if] [in] [pweight aweight iweight] [, SEEout REPLACE NOSEEOUT NOREPLACE CROSStab AGAIN * ]


*** bys( ): by(onecall) indicated by `_byvars' only

* goes with `second'
if `"`second'"'~="" {
	local _colon ":"
}

if "`_byvars'"~="" {
	bys `_byvars' : outreg2_by `0' `_colon' `second'
}
else if "`crosstab'"~="" {
	outreg2_by `0' `_colon' `second'
}
else {
	* regular stuff
	if `"`using'"'~="" {
		* both prefix full syntax and regular non-prefix usage
		* `second' could contain " " only
		`second'
		_outreg2 `0'
	}
	else {
		* prefix shorthand synatx
		syntax [anything] [, REPLACE SEEout APpend]
		
		`second'
		
		*** read the set preference if not out of date
		
		* NOTE: `0' is written over below
		
		cap quietly findfile outreg2.pref
		if _rc~=0 & "`Version7'"~="" {
			* create it if missing
			findfile outreg2.ado
			local place=substr(`"`r(fn)'"',1,`=length(`"`r(fn)'"')-11')
			
			tempname myplace
			cap file open `myplace' using `"`place'outreg2.pref"', write text replace
			cap file write `myplace' "" _n
			cap file write `myplace' "" _n
			cap file write `myplace' ""
			cap file close `myplace'
		}
		
		tempname myfile
		cap file open `myfile' using `"`r(fn)'"', read text
		cap file read `myfile' date
		cap file read `myfile' pref
		cap file read `myfile' options
		cap file close `myfile'
		
		* fix _comma
		local _comma ""
		if `"`macval(options)'"'~="" | "`replace'"~="" | "`seeout'"~="" {
			local _comma ","
		}
		
		if "`date'"== "`c(current_date)'" {
			local seecommand "outreg2"
			local precommand "_outreg2"
			foreach var in anything  macval(pref) _comma macval(options) replace seeout {
				if `"``var''"'~="" {
					if `"``var''"'=="," {
						local seecommand `"`seecommand'``var''"'
						local precommand `"`precommand'``var''"'
					}
					else {
						local seecommand `"`seecommand' ``var''"'
						local precommand `"`precommand' ``var''"'
					}
				}
			}
			*local cl `"{stata `"`seecommand'"':  `seecommand'}"'
			*di as txt `"`cl'"'
			di in white `"  `seecommand'"'
			`precommand'
		}
		else {
			di in red "must specify the full syntax (the last preference has expired)"
			exit 100
		}
	}
}
	
*** saving the current preferences
if `"`using'"'=="" {
	local _0 `"`seecommand'"'
}

local 0 `"`_0'"'

* take out sum/crosstab and
* take out [if] [in] [pweight aweight iweight] 
* take out non-user specified options: replace/noreplace seeout/noseeout 
syntax [anything] [using] [if] [in] [pweight aweight iweight] [, REPLACE NOREPLACE SUM SUM2(string) CROSStab SEEout /*
	*/ NOSEEOUT CTTOP *]

local pref `"`using'"'

* NOTE: `0' has been overwritten long ago
		
		cap quietly findfile outreg2.pref
		if _rc~=0 & "`Version7'"~="" {
			* create it if missing
			findfile outreg2.ado
			local place=substr(`"`r(fn)'"',1,`=length(`"`r(fn)'"')-11')
			
			tempname myplace
			cap file open `myplace' using `"`place'outreg2.pref"', write text replace
			cap file write `myplace' "" _n
			cap file write `myplace' "" _n
			cap file write `myplace' ""
			cap file close `myplace'
		}
		
cap quietly findfile outreg2.pref
tempname myfile

* capture for write protected files
cap file open `myfile' using `"`r(fn)'"', write text replace
cap file write `myfile' `"`c(current_date)'"' _n
cap file write `myfile' `"`pref'"' _n
cap file write `myfile' `"`options'"'
cap file close `myfile'

*** display clickables
foreach var in dta tex word excel {
	if `"`cl_`var''"'~="" {
		noi di as txt `"`cl_`var''"' 
	}
}

*** cdout thing
noi _cdout, cont

foreach var in see {
	if `"`cl_`var''"'~="" {
		noi di as txt `"`cl_`var''"' 
	}
}


* restoring the currently active estimate here
cap _estimates unhold `coefActive'

end /* end of outreg2 */


********************************************************************************************


prog define outreg2_by, by(recall, nohead)
	versionSet
	version `version'

preserve

gettoken first second : 0, parse(":") `bind' match(par) quotes
local 0 `"`first'"'
while `"`first'"'~=":" & `"`first'"'~="" {
	gettoken first second : second, parse(":") `bind' match(par) quotes

}

if `"`0'"'==":" {
	* colon only when shorthand combined with prefix
	local 0
}
else {
	local _0 `"`0'"'
}

*** shorthand syntax if [using] is missing
syntax [anything] [using] [if] [in] [pweight aweight iweight] [, SEEout REPLACE NOSEEOUT NOREPLACE CROSStab AGAIN * ]

*** bys( ) clean up: touse, ctitle/cctop, replace/noreplace, seeout/noseeout
if `=_by()'==1 {
	
	marksample touse
	
	* generate column heading when -by- specified
	if `"`cttop'"'~="" {
		local cc=1
		
		tokenize `_byvars'
		while "``cc''"~="" {
			
			* should there be `touse' here?
			qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse', meanonly
			if r(N)<. {
				local actual`cc' =r(mean)
			}
			else {
				local actual`cc' =.
			}
			
			* place cttop in there
			local _comma
			if `cc'~=1 {
				local _comma ","
			}
			
			local cttop "`cttop'`_comma' ``cc'' `actual`cc'' "
			*local cttop "`cttop'`_comma' ``cc'', `actual`cc'' "
			local cc=`cc'+1
		}
	}
	else {
		local cc=1
		local cttop ""
		
		tokenize `_byvars'
		while "``cc''"~="" {
			
		* should there be `touse' here?
		qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse', meanonly
			if `r(N)'<. {
				local actual`cc' =r(mean)
			}
			else {
				local actual`cc' =.
			}
			
			* place cttop in there
			local _comma
			if `cc'~=1 {
				local _comma ","
			}
			
			local cttop "`cttop'`_comma' ``cc'' `actual`cc'' "
			*local cttop "`cttop'`_comma' ``cc'', `actual`cc'' "
			local cc=`cc'+1
		}
	}
	
	* lazy
	qui keep if `touse'==1
	
	local 0 `0' cttop(`cttop')
	
	* drop bys( ) from ctitles
	if "`drop'"=="" {
		local drop `"`_byvars'"'
		local 0 `0' drop(`drop')
	}
	
	* replace first when -by- specified
	if `=_byindex()'==1 {
		local noreplace ""
	}
	else {
		local noreplace "noreplace"
	}
	
	* seeout last when -by- specified
	if `=_bylastcall()'==0 {
		local noseeout "noseeout"
	}
	else {
		local noseeout ""
	}
	
	
	* pass an embedded indicator to the second runs
	if "`again'"=="" {
		local again "again"
	}
	
	* simplify by dropping them
	drop `touse' `_byindex'
}

* this will include the outputs from bys( ) routine above:
local 0 `0' `noreplace' `noseeout'

* for multiple tabs
local names `"`anything'"'
if "`crosstab'"=="crosstab" & `"`names'"'=="" {
	noi di in red "varlist required for {opt crosstab} option"
	exit 100
}

* separate the first variable from the rest, which are for the bys( )
gettoken first rest : names, parse(" ")
if "`crosstab'"=="crosstab" & "`first'"~="" & "`rest'"~="" {
	cap drop _fillin
	cap fillin `rest'
	if "`replace'"=="replace" {
		
	}
	*local 0 `first' `if' `in' [`weight'`exp'] `using', `seeout' `replace' `crosstab' nonotes `options' cttop(`cttop')
	local 0 `first' `using', `seeout' `replace' `crosstab' nonotes `options' cttop(`cttop')
	
	if `"`second'"'=="" {
		qui bys `rest' : outreg2_by `0'
	}
	else {
		noi bys `rest' : outreg2_by `0' : `second'
	}
}
else {
	* single tabs or no crosstab at all
	if (`"`second'"'=="" | `"`second'"'==" ") & `"`using'"'~="" {
		* non-prefix
		_outreg2 `0'
	}
	else {
		`second'
		_outreg2 `0'
	}
} /* no crosstab */


*** pass it forward
foreach var in tex word excel see dta {
	c_local cl_`var' `"`cl_`var''"' 
}

end /* end of outreg2_by */


********************************************************************************************


prog define _outreg2
	* write formatted regression output to file
	
	versionSet
	version `version'
	
syntax [anything] using  [if] [in] [pweight aweight iweight] [,			/*
*/ eqdrop(string) eqkeep(string) drop(string) keep(string) INDDrop(str)		/*
*/ matrix(string)	noNOBS noOBS								/*
*/ COEfastr APpend REPLACE NOREPLACE SEEout NOSEEOUT					/*
*/ LABel LABelA(str asis) TItle(passthru) CTitle(string) CTTOP(string)		/*
*/ EXCEL TEX TEX1(passthru) WORD DTA DTAa(str asis) TEXT 				/*
*/ EQuationsA(passthru)	Onecol LONG wide SIDEway COMma Quote noNOTes 		/*
*/ ADDNote(passthru) STats(string asis) stnum(str asis) ststr(str asis)		/*
*/ noSE TSTAT Pvalue CI BEta									/*
*/ Level(integer $S_level) 									/*
*/ noPAren PARenthesis(string asis) BRacket BRacketA(string)			*]

local usingTemp `"`using'"'
local ifTemp `"`if'"'
local inTemp `"`in'"'
local weightTemp `"`weight'"'
local expTemp `"`exp'"'

local cttop1 `"`cttop'"'
local cttop

local drop1 `"`drop'"'
local drop

* cascading options:
local 0 `", `options'"'
syntax [, noASter	2aster ALPHA(passthru) SYMbol(passthru) 10pct 			/*
*/ ASTERisk(passthru)										/*
*/ noCONs noNI noR2 ADJr2 E(string)								/*
*/ ADDStat(passthru) ADDText(string) 							/*
*/ EForm MFX Margin1 Margin2(string)							/*
*/ SUM SUM2(string) CROSStab TAB3(string)							/*
*/ sortcol(string) sortvar(string) groupvar(string)					/*
*/ CTTOP(string) drop(string)									/*
*/ again leave(string)										/*
*/ pivot xpose slow(numlist) raw								*] 

* cascading options:
local 0 `", `options'"'
syntax [, DEC(numlist int >=0 <=11 max=1) FMT(passthru) 				/*
*/ BDec(numlist int >=0 <=11) BFmt(string asis) 					/*
*/ SDec(numlist int >=0 <=11) SFmt(string asis) 					/*
*/ Tdec(numlist int >=0 <=11 max=1) TFmt(string asis)					/*
*/ PDec(numlist int >=0 <=11 max=1) PFmt(string asis) 				/*
*/ CDec(numlist int >=0 <=11 max=1) CFmt(string asis) 				/*
*/ ADec(numlist int >=0 <=11 max=1)	AFmt(string asis)					/*
*/ RDec(numlist int >=0 <=11 max=1) RFmt(string asis)					/*
*/ AUTO(integer 3) LESS(integer 0) NOAUTO	DECMark(str asis)				]

local using `"`usingTemp'"'
local using `"`usingTemp'"'
local if `"`ifTemp'"'
local in `"`inTemp'"'
local weight `"`weightTemp'"'
local exp `"`expTemp'"'

* consolidate twice-mentioned options by double bys( )
if `"`cttop'"'=="" {
	local cttop `"`cttop1'"'
}
else if `"`cttop1'"'~="" {
	local cttop `"`cttop1', `cttop'"'
}

if `"`drop'"'=="" {
	local drop `"`drop1'"'
}
else if `"`drop1'"'~="" {
	local drop `"`drop1', `drop'"'
}

* name of 1st column containing variable names
local VARIABLES "VARIABLES"
local VARIABLES1 "VARIABLES"

***  a partial list of original macro names
* neq is the number of equation
* numi is e(N_g), the xt number of groups
* noNI is user request to not to report xt number of groups
* ivar is the e(ivar), the id for xt

*** the original ctitle
local ctitle0 `"`ctitle'"'

*** replace/noreplace seeout/noseeout
if "`noreplace'"=="noreplace" {
	local replace ""
	local noreplace ""
}
if "`noseeout'"=="noseeout" {
	local seeout ""
	local noseeout ""
}

*** default warnings
if "`replace'"=="replace" & "`append'"=="append" {
	di in green "replaced when both {opt replace} and {opt append} chosen"
	local replace "replace"
	local append ""
}

*** set default options
if "`replace'"=="" & "`append'"=="" {
	local append "append"
}

*** betaco option into beta
if "`betaco'"=="betaco" {
	local beta "beta" {
}

*** no observation
if "`nobs'"=="nonobs" {
	* recycling the original outreg option
	local obs "noobs"
	local nobs ""
}
* casewise and raw
if "`raw'"=="raw" & "`casewise'"=="casewise" {
	noi di in red "cannot choose {opt case:wise} and {opt raw} at the same time"
	exit 198
}
* laptop slowdown
if "`slow'"=="" {
	local slow 1
}

*** separate the varist from the estimates names
local open=index("`anything'","[")
local close=index("`anything'","]")

if `open'~=0 & `close'~=0 {
	local estimates=trim(substr("`anything'",`open'+1,`close'-`open'-1))
	local temp1=trim(substr("`anything'",1,`open'-1))
	local temp2=trim(substr("`anything'",`close'+1,length("`anything'")))
	local varlist=trim("`temp1' `temp2'")
}
else {
	local varlist "`anything'"
}

/*
*** pre-clean
if "`varlist'"~="" {
	if `a_version'>=11 {
		fvunab varlist : `varlist'
		fvexpand `varlist'
		local varlist `r(varlist)'
	}
	else {
		tsunab varlist : `varlist'
	}
	macroUnique `varlist', names(varlist)
}
*/



*** varlist, keep, drop, eqkeep, eqdrop
if "`varlist'"~="" & "`keep'"~="" {
	di in yellow "{opt keep( )} supersedes {opt varlist} when both specified"
}
if "`drop'"~="" & "`keep'"~="" {
	di in red "cannot specify both {opt keep( )} and {opt drop( )}"
	exit 198
}


*** pre-clean
if "`varlist'"=="" & "`keep'"~="" {
	local varlist `keep'
}






/******* allow this for now due to drop(`_byvars')
if "`drop'"~="" & "`varlist'"~="" {
	* crosstab exception for MISSING
	if "`crosstab'"~="crosstab" {
		di in red "cannot specify both {it:varlist} and {opt drop( )}"
		exit 198
	}
}
*/

if "`eqdrop'"~="" & "`eqkeep'"~="" {
	di in red "cannot specify both {opt eqkeep( )} and {opt eqdrop( )}"
	exit 198
}





if "`drop'"~="" {
	* one by one to accomodate MISSING from _tab3
	foreach var in `drop' {
		cap tsunab temp : `var'
		local tempDrop "`tempDrop' `temp'"
	}
	local drop "`tempDrop'"
	macroUnique `drop', names(drop)
}


if "`sortvar'"~="" {
/*	gettoken first second: sortvar, parse(" ")
	local sortvar
	while `"`first'"'~="" {
		cap tsunab temp : `sortvar'
		if !_rc {
			local sortvar `"`sortvar' `temp'"'
		}
		gettoken first second: second, parse(" ")
	}
*/
	tokenize `sortvar'
	local num 1
	local collect ""
	while "``num''"~="" {
		cap tsunab temp : ``num''
		if !_rc {
			local collect "`collect' `temp'" 
		}
		else {
			local collect "`collect' ``num''" 	
		}
		local num=`num'+1
	}
	local sortvar "`collect'"
	macroUnique `sortvar', names(sortvar)
}
if "`sortvar'"~="" & "`groupvar'"~="" {
	noi di in red "cannot choose both {opt sortvar} and {opt groupvar}"
	exit 198
}
if "`groupvar'"~="" {
	tokenize `groupvar'
	local num 1
	local collect ""
	while "``num''"~="" {
		cap tsunab temp : ``num''
		if !_rc {
			local collect "`collect' `temp'" 
		}
		else {
			local collect "`collect' ``num''" 	
		}
		local num=`num'+1
	}
	local groupvar "`collect'"
	macroUnique `groupvar', names(groupvar)
}

* unambiguate the names of stored estimates (wildcards)
if "`estimates'"~="" {
	local collect ""
	foreach var in `estimates' {
		local temp "_est_`var'"
		local collect "`collect' `temp'"
	}
	unab estimates : `collect'
	local collect ""
	foreach var in `estimates' {
		local temp=substr("`var'",6,length("`var'")-4)
		local collect "`collect'`temp' "
	}
	local estimates=trim("`collect'")
}

* or use est_expand


tempname estnameUnique
* a place holding name to the current estimates that has no name entered into the outreg

if "`estimates'"=="" {
	local estStored 0
	local estimates="`estnameUnique'"
}
else {
	if "`Version7'"=="" {
		* it is version 7
		noi di in red "version 7 cannot specify stored estimates: " in white "`estimates'"
		exit 198
	}
	local estStored 1
	*cap local estimates: list uniq local(estimates)
	macroUnique `estimates', names(estimates)
}

*** checking sum and crosstab
local check1 `=("`crosstab'"~="" | "`tab3'"~="")'
local check2 `=("`sum'"~="" | "`sum2'"~="")'
local check3 `=("`mfx'"~="")'
local checks=`check1'+`check2'+`check3'

if `checks'>=2 {
	di in yel "cannot specify more than one of {opt sum}, {opt crosstab}, or {opt mfx} options"
	exit 198
}


if "`sum'"=="sum" & "`sum2'"=="" {
	local sum2 "regress"
}

*** get crosstab
if "`crosstab'"=="crosstab" {
	qui _tab3 `varlist' `if' `in' [`weight'`exp']
	
	local ebnames "e(freq)"
	local eVnames "e(percent)"
	local r2 "nor2"
	local sortcol "name"
	local obs "noobs"
	if `"`addstat'"'=="" {
		local addstat `"addstat("Total", e(total))"'
	}
	else {
		gettoken part rest: addstat, parse(" (")
		gettoken part rest: rest, parse(" (") /* strip off "addstat(" */
		local addstat `"addstat("Total", e(total), `rest'"'
	}
	
	* augment (usually has bys( ) variables in them)
	if `e(total)'==0 {
		local drop `"MISSING `drop'"'
	}
	
	if `"`ctitle0'"'=="" {
		local ctitle `"`varlist'"'
	}
	
	local VARIABLES `"`varlist'"'
	local notes "nonotes"
	
	local varlist ""
}
else if "`sum2'"~="" {
	
	local r2 "nor2"
	
	* allowable: log regress noindep detail
	optionSyntax, valid(log regress noindep detail) name(sum2) nameShow(sum( )) content(`sum2')
	
	if "`noindep'"=="noindep" & "`detail'"=="" {
		local regress "regress"
	}
	
	if "`log'"=="log" & "`detail'"=="detail" {
		di in red "cannot use both {opt log} and {opt detail} for {opt sum( )} option"
		exit 198
	}
	if "`log'"=="log" {
		
		* always raw because e(sample) might be empty for version 11
		noi _sum2 `if' `in' [`weight'`exp'], `log' raw
		
		local r2 "nor2"
		local notes "nonotes"
		local aster "noaster"
		local stats "coef"
		local obs "noobs"
		if `"`ctitle0'"'=="" {
			local ctitle `"`cttop',  \`depvar'"'
		}
		di
	}
	if "`detail'"=="detail" {
		* always raw because e(sample) might be empty for version 11
		noi _sum2 `if' `in' [`weight'`exp'], `detail' raw
		
		local r2 "nor2"
		local notes "nonotes"
		local aster "noaster"
		local stats "coef"
		local obs "noobs"
		if `"`ctitle0'"'=="" {
			local ctitle `"`cttop',  \`depvar'"'
		}
		di
	}
	if "`regress'"=="regress" {
******************** take off the number in the front for reg3 dependent variables 2price 3price etc
******************** unab, tsuab
		
		if "`e(depvar)'"~="" | "`e(depvar)'"~="." {
			local sumVar1 `e(depvar)'
		}
			
			* borrowed from below (for multiple equations)
			* workaround for 8.0: e(b) must be converted to a regular matrix to get at it
			tempname tempMatrix
			mat `tempMatrix'=e(b)
			local sumVar2: colnames `tempMatrix'
			
			* workaround for 8.0: e(b) must be converted to a regular matrix to get at it
			local eqlist: coleq `tempMatrix'
			
			if "`Version7'"~="" {
				local eqlist: list clean local(eqlist)
				local eqlist: list uniq local(eqlist)
			}
			else {
				* probably needed for the first character
				local temp=index("`eqlist'","_")
				if `temp'==1 {
					local eqlist=subinstr("`eqlist'", "_", "", .)
				}
				* also make unique
				macroUnique `eqlist', names(eqlist7) number(eqnum7)
				local eqlist `eqlist7'
			}
			
			* counting the number of equation
			local eqnum: word count `eqlist'
			* local eqnum : list sizeof eqlist
		
		* redundant subtractions
		*local minus "_cons"
		*local sumVar2: list sumVar2 - minus
		* do it by hand:
		tokenize `sumVar2'
		local num 1
		local sumVar2 ""
		while "``num''"~="" {
			* manually take out o. prefix as well
			gettoken one two: `num', parse(".")
			if "``num''"~="_cons" & "`one'"~="o" {
				local sumVar2 "`sumVar2' ``num''"
			}
			local num=`num'+1
		}
		
		if "`noindep'"=="noindep" {
			noi _sum2 `sumVar2' `if' `in' [`weight'`exp'],  `raw'
		}
		else {
			noi _sum2 `sumVar1' `sumVar2' `if' `in' [`weight'`exp'],  `raw'
		}
		
		if 1<`eqnum' & `eqnum'<. {
			noi di in yel "Check your results; -sum- option not meant for multiple equation model"
		}
	}
	
	local ebnames "e(mean)"
	local eVnames "e(Var)"
	
	if `"`ctitle'"'=="" {
		if `"`cttop'"'=="" {
			local cttop `"mean, (sd)"'
			if `"`if'"'~="" {
				gettoken first second: if, parse(" ")
				local cttop `"`cttop',  `second'"'
			}
			if `"`in'"'~="" {
				local cttop `"`cttop',  `in'"'
			}
		}
		else {
			local cttop `"`cttop',  mean, (sd)"'
			if `"`if'"'~="" {
				gettoken first second: in, parse(" ")
				local cttop `"`cttop',  `second'"'
			}
			if `"`in'"'~="" {
				local cttop `"`cttop',  `in'"'				
			}
		}
	}
	
	loca sum_N
	local r2 "nor2"
	local notes "nonotes"
	local aster "noaster"
	local sortcol "later"
}
else {

if "`matrix'"~="" {
*** matrix names
	local ebnames "`matrix'"
	local eVnames "e(V)"
	
	if "`stats'"=="" {
		local stats "coef"
	}
	if "`r2'"=="" {
		local r2 "nor2"
	}
	if "`aster'"=="" {
		local aster "noaster"
	}
	if "`notes'"=="" {
		local notes "nonotes"
	}
	if "`ctitle'"=="" {
		local ctitle "`matrix'"
	}
	if "`obs'"=="" {
		local obs "noobs"
	}
}
else {
	*** ereturn matrix names
	if "`mfx'"~="mfx" {
		cap confirm matrix e(b)
		if _rc & "`Version7'"~="" & "`sum2'"=="" {
			if "`varlist'"~="" {
				* sets e(sample)
				di in red "matrix e(b) not found; run or post a regression first"
				exit 111
				*eretSet `varlist'
			}
			else {
				* it does not exist
				di in red "matrix e(b) not found; run or post a regression first"
				exit 111
			}
		}
	}
	*************************** get user specified matrices
	local ebnames "e(b)"
	local eVnames "e(V)"
	
	if "`mfx'"=="mfx" {
		if "`Version7'"~="" {
			cap confirm matrix e(Xmfx_dydx)
			if _rc {
				* it does not exist
				di in red "matrix e(Xmfx_dydx) not found; need to run {cmd:mfx} first"
				exit 111
			}
		}
		local ebnames "e(Xmfx_dydx)"
		local eVnames "e(Xmfx_se_dydx)"
		local eXnames "e(Xmfx_X)"
	}
}
}

* noSE: because se indicates stn.err, convert noSE into something else
if "`se'"=="nose" {
	local se_skip "se_skip"
}

* stats( ) is not compatible with two-column options
if "`stats'"~="" {
	if "`se'"=="nose" {
		di in red "cannot specify both {opt st:ats( )} and {opt nose} options"
		exit 198
	}
	if "`ci'"=="ci" {
		di in red "cannot specify both {opt st:ats( )} and {opt ci} options"
		exit 198
	}
	if "`tstat'"=="tstat" {
		di in red "cannot specify both {opt st:ats( )} and {opt tstat} options"
		exit 198
	}
	if "`pvalue'"=="pvalue" {
		di in red "cannot specify both {opt st:ats( )} and {opt p:value} options"
		exit 198
	}
	if "`beta'"=="beta" {
		di in red "cannot specify both {opt st:ats( )} and {opt be:ta} options"
		exit 198
	}
}

* always se instead of tstat
if "`tstat'"~="tstat" & "`pvalue'"~="pvalue" & "`ci'"~="ci" & "`beta'"~="beta" {
	if "`stats'"=="" {
		local se "se"
	}
}
else {
	local se ""
}

if "`parenthesis'"=="" & "`paren'"~="noparen" {
	if "`ci'"~="" {
		local parenthesis "ci"
	}
	if "`pvalue'"~="" {
		local parenthesis "pval"
	}
	if "`tstat'"~="" {
		local parenthesis "tstat"
	}
	if "`beta'"~="" {
		local parenthesis "beta"
	}
	if "`se'"=="se" {
		local parenthesis "se"
	}
}


*** clean up file name, enclose .txt if no file type is specified
*** else take care of user-specified extension names for excel word tex dta files
local rest "`using'"
* strip off "using"
gettoken part rest: rest, parse(" ")
* strip off quotes
gettoken first second: rest, parse(" ")
cap local rest: list clean local(rest)

local rabbit `"""'
if index(`"`using'"', ".")==0 {
	local file = `"`rabbit'`first'.txt`rabbit'"'
	local using = `"using `file'"'
}
else {
	local file = `"`rabbit'`first'`rabbit'"'
	local using = `"using `file'"'
	
	* strip off quotes and extension
	gettoken first second: file, parse(" ")
	local temp = `"`first'"'
	
	local next_dot = index(`"`temp'"',".")
	local next_strip = substr(`"`temp'"',1,`=`next_dot'-1')
	local strippedname = substr(`"`temp'"',1,`=`next_dot'-1')
	
	* check for more dots
	local change 0
	while `change'==0 {
		local temp = substr(`"`temp'"',`=`next_dot'+1',.)
		if index(`"`temp'"', ".")~=0 {
			local next_dot = index(`"`temp'"',".")
			local next_strip = substr(`"`temp'"',1,`=`next_dot'-1')
			local strippedname = `"`strippedname'.`next_strip'"'
		}
		else {
			* no change
			local last_strip = `"`temp'"'
			local change 1
		}
	}
	
	*** check for manual rtf doc xlm xls csv extensions
	if `"`last_strip'"'=="rtf" | `"`last_strip'"'=="doc" {
		local word "word"
		
		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local wordFile "`last_strip'"
	}
	if `"`last_strip'"'=="xls" | `"`last_strip'"'=="xml" | `"`last_strip'"'=="xlm" | `"`last_strip'"'=="csv" {
		local excel "excel"
		
		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local excelFile "`last_strip'"
	}
	if `"`last_strip'"'=="tex" {
		if `"`tex1'"'=="" {
			local tex "tex"
		}
		
		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local texFile "`last_strip'"
	}
}

*noi di in red "`next_strip'"
*noi di in red "`last_strip'"
*noi di in red "`strippedname'"


*** confirm the output file existance, to be adjusted later
cap confirm file `file'
if !_rc {
	* it exists
	local fileExist 1
}
else {
	local fileExist 0
}

*** mainfile
* cleaning the user provided inputs

if "`long'"=="long" & "`onecol'"=="onecol" {
	di in yellow "{opt long} implies {opt o:necol} (no need to specify both)"
}
if "`long'"=="long" & "`onecol'"~="onecol" {
	local onecol "onecol"
}

if ("`tstat'"!="")+("`pvalue'"!="")+("`ci'"!="")+("`beta'"!="")>1 {	
	di in red "choose only one of tstat, pvalue, ci, or beta"
	exit 198
}

if `level'<10 | `level'>99 {
	di in red "level() invalid"
	exit 198
}

if `"`paren'"'=="noparen" & `"`parenthesis'"'~="" {
	di in red "cannot choose both {opt nopa:ren} and {opt paren:thesis()} option"
	exit 198
}
if `"`paren'"'=="noparen" & `"`bracketA'"'~="" {
	di in red "cannot choose both {opt nopa:ren} and {opt br:acket()} option"
	exit 198
}
if  `"`bracket'"'~="" & `"`bracketA'"'~="" {
	di in red "cannot choose both {opt br:acket} and {opt br:acket()} option"
	exit 198
}

if "`symbol'"=="" & "`sigsymb'"~= "" {
	local symbol "`sigsymb'"
}
if `"`10pct'"'~="" & "`sigsymb'"~="" {
	di in red "cannot choose both {opt 10pct} and {opt sigsymb( )}"
	exit 198
}

if `"`10pct'"'~="" & "`symbol'"~="" {
	di in red "cannot choose both {opt 10pct} and {opt symbol( )}"
	exit 198
}
if `"`10pct'"'~="" & "`symbol'"=="" {
	local symbol `"symbol(**, *, +)"'
}
if "`aster'"=="noaster" & ("`asterisk'"~="" | "`symbol'"!="") {
	if "`asterisk'"~="" {
		di in red "cannot choose both {opt noaster} and {opt asterisk( )}"
	}
	else {
		di in red "cannot choose both {opt noaster} and {opt symbol( )}"
	}
	exit 198
}

if (`"`addnote'"'!="" & "`append'"=="append" & `fileExist'==1) {
	di in yellow "warning: addnote ignored in appended columns"
}

*** LaTeX options
local tex = ("`tex'"!="")
if "`tex1'"!="" {
	if `tex' {
		di in red "may not specify both {opt tex} and {opt tex()} options"
		exit 198
	}
	local tex 1
	
	gettoken part rest: tex1, parse(" (")
	gettoken texopts zilch: rest, parse(" (") match(parns) /* strip off "tex1()" */
}

_texout_parse, `texopts'

* insert nopretty
local check=index(`"`tex1'"',"nopretty")
if `check'==0 {
	local check=index(`"`tex1'"',"pretty")
	if `check'==0 {
		* neither
		local texopts "nopretty `texopts'"
	}
}


*** label options
if "`label'"=="label" & "`labelA'"~="" {
	di in red "cannot specify both {opt lab:el} and {opt lab:el()} options"
	exit 198
}
if "`labelA'"~="" {
	* pre-clean
	optionSyntax, valid(insert upper lower proper) name(labelA) nameShow(label( )) content(`labelA')
	local labelOption `"`optionList'"'
	if "`proper'"~="" & "`upper'"~="" {
		noi di in red "cannot specify together: label(proper upper)"
		exit 198
	}
	if "`proper'"~="" & "`lower'"~="" {
		noi di in red "cannot specify together: label(proper lower)"
		exit 198
	}
	if "`lower'"~="" & "`upper'"~="" {
		noi di in red "cannot specify together: label(lower upper)"
		exit 198
	}
}

*** equationsA options
if "`equationsA'"~="" {
	gettoken part rest: equationsA, parse(" (")
	gettoken equationsOption zilch: rest, parse(" (") match(parns) /* strip off "label()" */
	local equationsOption=trim("`equationsOption'")
	
	if "`equationsOption'"~="auto" {
		di in red "cannot specify any option other than {opt auto} for {opt eq:uation( )}"
		exit 198
	}
	else if "`equationsOption'"~="auto" {
		*local label "label"
	}
}


if (`"`addstat'"'=="" & "`adec'"!="" & "`e'"=="" ) {
	di in red "cannot choose adec option without addstat option"
	exit 198
}
if "`adec'"=="" {
	* disabled
	*local dec 3
	*local adec = `dec'
}

if "`quote'"!="quote" {
	local quote "noquote"
}

tempname df_r

if "`margin1'"~="" | "`margin2'"~="" {
	if "`mfx'"=="mfx" {
		di in red "cannot specify both {opt mfx} and {opt margin} options"
		exit 198
	}
	
	local margin = "margin"
	if "`margin2'"~="" {
		local margucp "margucp(_`margin2')"
		scalar `df_r' = .
		if "`margin1'"~="" {
			di in red "may not specify both margin and margin()"
			exit 198
		}
	}
	else {
		if "`e(cmd)''"=="tobit" {
			di in red "dtobit requires margin({u|c|p}) after dtobit command"
			exit 198
		}
	}
}


*** titlefile needs set out here
tempfile titlefile
	
	*** logistic reports coeffients in exponentiated form (odds ratios)
	if "`cmd'"=="logistic" {
		local eform "eform"
		
		* report no cons
		if "`eform'"=="eform" {
			local cons "nocons"
		}
	}
	
	* force them long
	if "`e(cmd)'"=="oprobit" | "`e(cmd)'"=="ologit" {
		local long long
		local onecol onecol
	}
	
	if "`wide'"=="wide" {
		local long
		local onecol
	}
	
	*** stats( ) option cleanup : dealing with rows/stats to be reported per variable/coeff
	local statsValid "eqname varname label label_pr label_up label_low coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b "
	
	* level coef_eform se_eform coef_beta se_beta"
	
	local asterAsked 0
	local betaAsked ""
	
	/*
	if `"`estats'"'~="" {
		* the names of the available stats in e(matrices)
		local ematrices ""
		local var: e(matrices)
		
		*noi di in yellow "`var'"
		
		tokenize `var'
		local i=1
		while "``i''"~="" {
			*** di "e(``i'')" _col(25) "`e(``i'')'"
			local ematrices="`ematrices'``i'' "
			local i=`i'+1
		}
	}
	*/
	
	if `"`stats'"'~="" {
		* take out commas
		gettoken one two: stats, `bind' parse(", ")
		gettoken comma rest: two, `bind' parse(", ")
		if "`comma'"=="," {
			local two `"`rest'"'
		}
		local tempList `"`one'"'
		while `"`two'"'~="" & `"`two'"'~=" " {
			gettoken one two: two, `bind' parse(", ")
			gettoken comma rest: two, `bind' parse(", ")
			if "`comma'"=="," {
				local two `"`rest'"'
			}
			local tempList `"`tempList' `one'"'
		}
		local stats `"`tempList'"'
		local tempList
		
		local matList
		
		
		* need to count using -gettoken, bind- instead of merely -local statsMany : word count `stats'-
		
		local num=0
		local statsMany 0
		local two `"`stats'"'
		
		while `"`two'"'~="" & `"`two'"'~=" " {
			local num=`num'+1
			local statsMany=`statsMany'+1
			
			gettoken one two: two, `bind' parse(", ")
			gettoken comma rest: two, `bind' parse(", ")
			if "`comma'"=="," {
				local two `"`rest'"'
			}
			
			local stats`num' `"`one'"'
			
			* it must be one of the list
			local test 0
			foreach var in `statsValid' {
				if "`var'"=="`stats`num''" & `test'==0 {
					local test 1
				}
				
				* checking if aster/beta specified
				if "`stats`num''"=="aster" {
					local asterAsked 1
				}
				if "`stats`num''"=="beta" {
					local betaAsked "betaAsked"
				}
			}
			if `test'==0 {
				* not on the list of valid ones
				capture confirm matrix `stats`num''
				if !_rc {
					* matrix exists
					local matList `"`matList' `stats`num''"'
	               	}
				else {
					* send it to parser
					cap _stats_parse, `stats`num''
					if _rc~=0 {
						noi di in white "`stats`num''" in red " is not a valid stats, str( ), cmd( ), e( ), mat( ), etc. for {opt stats( )}"
						exit 198
					}
				}
			}
			
			* okay to add:
			local statsList "`statsList' `stats`num''"
			
			
		}
	}
	else if "`se_skip'"=="se_skip" {
		local statsMany 1
		local statsList "coef"
	}
	else {
		local statsMany 2
		
		if "`ci'"=="ci" {
			if "`eform'"=="eform" {
				local statsList "coefEform ciEform"
			}
			else {
				local statsList "coef ci"
			}
		}
		else if "`beta'"=="beta" {
			local statsList "coef beta"
		}
		
		* regular: tstat, pval, or se
		else if "`eform'"=="eform" {
			local statsList "coefEform seEform"
			
			if "`tstat'"=="tstat" {
				local statsList "coefEform tstat"
			}
			else if "`pvalue'"=="pvalue" {
				local statsList "coefEform pval"
			}
		}
		else {
			local statsList "coef se"
			
			if "`tstat'"=="tstat" {
				local statsList "coef tstat"
			}
			else if "`pvalue'"=="pvalue" {
				local statsList "coef pval"
			}
		}
	}
	
	* when stats(aster) specified, aster( ) should not be attached to coef unless asked
	if `asterAsked'==1 & "`asterisk'"=="" {
		* the encased blank will trigger the parsing codes in makeFile
		local asterisk " "
	}
	
	
	* update when eform specified
	if "`eform'"=="eform" {
		* blank at end
		local statsList "`statsList' "
		local statsList : subinstr local statsList "coef " "coefEform ", all
		local statsList : subinstr local statsList "ci " "ciEform ", all
		local statsList : subinstr local statsList "se " "seEform ", all
		
		local statsList : subinstr local statsList "ci_high " "ci_highEform ", all
		local statsList : subinstr local statsList "ci_low " "ci_lowEform ", all
	}
	
	* parenthesis locations moved to makeFile
	
	* check that nothing appears in parenthesis( ) does not appear in stats( )
	macroMinus `parenthesis', names(temp) subtract(`statsList' `stats')
	if "`temp'"~="" & "`stats'"~="" {
		noi di in red "`temp' appears in parenthesis( ) but not in stats( )"
		exit 198
	}
	
	
	* clean up matList
	if `"`matList'"'~="" {
		tokenize `matList'
		local rnum 1
		local num 1
		while `"``num''"'~="" {
			* take off the parenthesis crap
			local temp
			local temp = substr(`"``num''"',1,2)
			if "`temp'"=="r(" {
				* r( ) matrix
				local content = substr(`"``num''"',3,length("``num''")-3)
				* not currently accepting
				di in red "r-class matrix " in white "``num''" in red " not accepted by {opt stats( )}"
				exit 198
				local rnum=`rnum'+1
			}
			*if "`temp'"=="e(" {
			*	* r( ) matrix
			*	local content = substr(`"``num''"',3,length("``num''")-3)
			*	* not currently accepting
			*	di in red "e-class matrix " in white "``num''" in red " not accepted by {opt stats( )}"
			*	exit 198
			*	local rnum=`rnum'+1
			*}
			local num=`num'+1
		}
	}
	
	
	*** expand statsList and statsMany according to vector/nonvec matrices
	
	* these two are collected, but not used here
	local vectorList
	local nonvecList
	
	if "`matList'"~="" {
		tempname matdown
		foreach matname in `matList' {
			mat `matdown'=`matname'		/* NOT transposed */
			local temp= colsof(`matdown')
			
			if `temp'==1 {
				* it's a vector
				local vectorList "`vectorList' `matname'"
			}
			else {
				* it's a non-vector matrix
				local cc= colsof(`matdown')
				local temp0 : colnames(`matdown')
				local temp
				foreach var in `temp0' {
					local temp "`temp' `matname'_`var'"
				}
				local nonvecList "`nonvecList' `temp'"
				
				* add the empty space at end
				local statsList =`"`statsList' "'
				local statsList =subinstr("`statsList'"," `matname' "," `temp' ",.)
				local statsMany `=`statsMany'+`cc'-1'
			}
		}
	}
	
	
	
	*** run each estimates consecutively
	local estmax: word count `estimates'
	forval estnum=1/`estmax' {
		local estname: word `estnum' of `estimates'
		if "`estimates'"~="`estnameUnique'" {
			qui estimates restore `estname'
		}
		* to avoid overwriting after the first time, append from the second time around (1 of 3)
		if `estnum'==2 & "`replace'"=="replace" {
			local append "append"
			local replace ""
		}
		
		* the names of the available stats in e( )
		local result "scalars"
			* took out macros from the local result
		local elist=""
		foreach var in `result' {
			local var: e(`var')
			tokenize `var'
			local i=1
			while "``i''"~="" {
				*** di "e(``i'')" _col(25) "`e(``i'')'"
				local elist="`elist'``i'' "
				local i=`i'+1
			}
		}
		*cap local elist: list uniq local(elist)
		macroUnique `elist', names(elist)
		
		* take out N (because it is always reported)
		local subtract "N"
		*cap local elist : list elist - subtract
		macroMinus `elist', names(elist) subtract(`subtract')
		
		* r2 option
		* save the original for the first run and restore prior to each subsequent run
		if `estnum'==1 {
			local r2Save `"`r2'"'
		}
		else {
			local r2 `"`r2Save'"'
		}
		
		*** e(all) option
		* save the original for the first run and restore prior to each subsequent run
		if `estnum'==1 {
			local addstatSave `"`addstat'"'
		}
		else {
			local addstat `"`addstatSave'"'
		}
		
		*** dealing with e( ) option: put it through addstat( )
		* local = expression restricts the length
		*	requires a work-around to avoid subinstr/substr functions
		
		* looking for "all" anywhere
		if "`Version7'"=="" {
			local position=index("`e'","all")
		}
		else {
			local position: list posof "all" in e
		}
		
		if `"`addstat'"'~="" {
			if "`e'"~="" {
				local e: subinstr local e "," " ",all
				*cap local e: list uniq local(e)
				macroUnique `e', names(e)
				
				if `position'~=0 {
					local count: word count `elist'
					local addstat=substr("`addstat'",1,length("`addstat'")-1)
					forval num=1/`count' {
						local wordtemp: word `num' of `elist'
						local addstat "`addstat',`wordtemp',e(`wordtemp')"
					}
				}
				else { /* other than all */
					local count: word count `e'
					local addstat=substr("`addstat'",1,length("`addstat'")-1)
					forval num=1/`count' {
						local wordtemp: word `num' of `e'
						local addstat "`addstat',`wordtemp',e(`wordtemp')"
					}
				}
				local addstat "`addstat')"
			}
		}
		
		* if addstat was previously empty
		else if "`addstat'"=="" {
			if "`e'"~="" {
				local e: subinstr	local e "," " ",all
				*cap local e: list uniq local(e)
				macroUnique `e', names(e)
				if `position'~=0 {
					local count: word count `elist'
					local addstat "addstat("
					forval num=1/`count' {
						local wordtemp: word `num' of `elist'
						local addstat "`addstat'`wordtemp',e(`wordtemp')"
						if `num'<`count' {
							local addstat "`addstat',"
						}
					}
				}
				else {
					local count: word count `e'
					local addstat "addstat("
					forval num=1/`count' {
						local wordtemp: word `num' of `e'
						local addstat "`addstat'`wordtemp',e(`wordtemp')"
						if `num'<`count' {
							local addstat "`addstat',"
						}
					}
				}
				local addstat "`addstat')"
			}
		}
		
		*** dealing with single/multiple equations
		*** also dealing with non-vector matrices, i.e. multiple columns
		
		
		
		
		* getting equation names
		tempname mainMatrix
		mat `mainMatrix'=`ebnames'
		
		* workaround for 8.0: e(b) must be converted to a regular matrix to get at it
		local eqlist: coleq `mainMatrix'
		
		if "`Version7'"~="" {
			local eqlist: list clean local(eqlist)
			local eqlist: list uniq local(eqlist)
		}
		else {
			* probably needed for the first character
			local temp=index("`eqlist'","_")
			if `temp'==1 {
				local eqlist=subinstr("`eqlist'", "_", "", .)
			}
			* also make unique
			macroUnique `eqlist', names(eqlist7) number(eqnum7)
			local eqlist `eqlist7'
		}
		
		* counting before eqkeep/eqdrop
		local eqnum_original: word count `eqlist'
		
		* drop some of multiple equations: 1 of 2
		
		if "`eqdrop'"~="" {
			* may not be a variable
			cap tsunab eqdrop : `eqdrop'
			*cap local eqlist : list eqlist - eqdrop
			macroMinus `eqlist', names(eqlist) subtract(`eqdrop')
			macroUnique `eqlist', names(eqlist)
		}
		
		if "`eqkeep'"~="" {
			* may not be a variable
			cap tsunab eqkeep : `eqkeep'
			local eqlist `"`eqkeep'"'
			macroUnique `eqlist', names(eqlist)
		}
		
		* counting the number of equation
		local eqnum: word count `eqlist'
		* local eqnum : list sizeof eqlist
		
		if "`Version7'"=="" {
			local eqnum `eqnum7'
		}
		
		* 0 if it is multiple equations; 1 if it is a single
		*if 1<`eqnum' & `eqnum'<. {
		if 1<`eqnum_original' & `eqnum_original'<. {
			local univar=0
		}
		else {
			local univar=1
		}
		
		tempname regN rsq numi r2mat    b vc b_alone convert
		*coefcol varname
		
		**** snipped portion moved here from above
		* for svy commands with subpop(), N_sub is # of obs used for estimation
		local cmd = e(cmd)
		
		local svy = substr("`cmd'",1,3)
		if "`svy'"=="svy" & e(N_sub) != . {
			scalar `regN' = e(N_sub)
		}  
		else {
			if "`sum2'"=="" {
				scalar `regN' = e(N)
			}
			else {
				scalar `regN' = e(sum_N)
			}
		}
		
		
		*** set up the usual stuff
		scalar `df_r' = e(df_r)
		
		local depvar = e(depvar)
		
		mat `b'=`ebnames'
		mat `vc'=`eVnames'
		
		if "`mfx'"=="mfx" {
			mat `vc' = `vc'' * `vc'
		}
		
		local bcols=colsof(`b')	/* cols of b */
		local bocols=`bcols'	/* cols of b only, w/o other stats */
		
		* the work around for xtmixed
		if "`e(N_g)'"=="matrix" {
			mat `convert'=e(N_g)
			scalar `numi'=`convert'[1,1]
		}
		else {
			scalar `numi' = e(N_g)
		}
		
		local	robust  = e(vcetype)
		if "`robust'"=="." {
			local robust "none"
		}
		local	ivar	 = e(ivar)
		* equals one if true	
		capture local fracpol = (e(fp_cmd)=="fracpoly")
		
		
		*** parse addstat to convert possible r(), e(), and s() macros to numbers
		* (to avoid conflicts with r-class commands used in this program)
		if `"`addstat'"'!="" {
			*** PRE-PARSE with autodigit disabled because r( ) needs to be evaluated before r-class autodigit
			local newadd=""
						
			gettoken part rest: addstat, parse(" (")
			gettoken part rest: rest, parse(" (") /* strip off "addstat(" */
			local i = 1
			while `"`rest'"' != "" {
				gettoken name rest : rest, parse(",") quote
				if `"`name'"'=="" {
					di in red "empty strings not allowed in addstat() option"
					exit 6
				}
				gettoken acomma rest : rest, parse(",")
				gettoken valstr rest : rest, parse(",")
				if `"`rest'"' == "" { /* strip off trailing parenthesis */
					local valstr = substr(`"`valstr'"',1,length(`"`valstr'"')-1)
					local comma2 ""
				}
				else {
					gettoken comma2 rest: rest, parse(",")
				}
				
				* creating e(p) if missing
				if ("`valstr'"=="e(p)" | trim("`valstr'")=="e(p)") & "`e(p)'"=="" {
					if "`e(df_m)'"~="" & "`e(df_r)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_m)',`e(df_r)',`e(F)')
					}
					else if "`e(df_m)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_m)',`e(chi2)')
					}
					* update if xtreg, fe is messing with it
					if "`e(df_m)'"~="" & "`e(df_b)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_b)',`e(df_r)',`e(F)')
					}
					else if "`e(df_b)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_b)',`e(chi2)')
					}
				}
				
				*local value = `valstr'
				*capture confirm number `value'
				*if _rc!=0 {
				* 	* di in red `"`valstr' found where number expected in addstat() option"'
				* 	* exit 7
				*}
				
				local value=`valstr'
				capture confirm number `value'
				
				if _rc==0 {
					* it's a number
					
					local value = `valstr'
					
					local count: word count `adec'
					local aadec : word `i' of `adec'
					
					*noi di "adec `adec' i `i' count `count' name `name' value `value'"
					* runs only if the user defined adec is absent for that number
					*if `i'>`count' & `i'<. {
					
					* now runs only if adec is present at all
					if "`adec'"=="" {
						
						* auto-digits: auto( ), cannot check for decmark (decimal separator) because comma is used for parsing						*autodigits2 `value' `auto'
						* needs to be less than 11
						*local valstr = string(`value',"%12.`r(valstr)'")
						local valstr = string(`value')
						if "`valstr'"=="" {
							local valstr .
						}
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
					}
					else {
						* using previous ones if no other option
						if "`aadec'"=="" {
							local aadec `prvadec'
						}
						local valstr = string(`value',"%12.`aadec'f")
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
						local prvadec = `aadec'
					}
				}
				else {
					* it's a non-number
					local index=index(`"`valstr'"',"e(")
					if `index'~=0 {
						if `"``valstr''"'=="" {
							* put a dot in there
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'.`comma2'"'
							noi di in yel `"check {stata eret list} for the existence of `valstr'"'
						}
						else {
							* passthru `valstr'
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
						}
					}
					else {
						* evaluate ``valstr''
						local value `"`valstr'"'
						local newadd `"`newadd'`name'`acomma'``valstr''`comma2'"'
					}
				}
				
				local i = `i'+1
			}
			local addstat `"`newadd'"'
			
			*** do it again with autodigit enabled
			local addstat `"addstat(`addstat')"'
			
			local newadd=""
			gettoken part rest: addstat, parse(" (")
			gettoken part rest: rest, parse(" (") /* strip off "addstat(" */
			local i = 1
			while `"`rest'"' != "" {
				gettoken name rest : rest, parse(",") quote
				if `"`name'"'=="" {
					di in red "empty strings not allowed in addstat() option"
					exit 6
				}
				gettoken acomma rest : rest, parse(",")
				gettoken valstr rest : rest, parse(",")
				if `"`rest'"' == "" { /* strip off trailing parenthesis */
					local valstr = substr(`"`valstr'"',1,length(`"`valstr'"')-1)
					local comma2 ""
				}
				else {
					gettoken comma2 rest: rest, parse(",")
				}
				
				* creating e(p) if missing
				if ("`valstr'"=="e(p)" | trim("`valstr'")=="e(p)") & "`e(p)'"=="" {
					if "`e(df_m)'"~="" & "`e(df_r)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_m)',`e(df_r)',`e(F)')
					}
					else if "`e(df_m)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_m)',`e(chi2)')
					}
					* update if xtreg, fe is messing with it
					if "`e(df_m)'"~="" & "`e(df_b)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_b)',`e(df_r)',`e(F)')
					}
					else if "`e(df_b)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_b)',`e(chi2)')
					}
				}
				
				*local value = `valstr'
				*capture confirm number `value'
				*if _rc!=0 {
				* 	* di in red `"`valstr' found where number expected in addstat() option"'
				* 	* exit 7
				*}
				
				local value=`valstr'
				capture confirm number `value'
				
				if _rc==0 {
					* it's a number
					
					local value = `valstr'
					
					local count: word count `adec'
					local aadec : word `i' of `adec'
					
					*noi di "adec `adec' i `i' count `count' name `name' value `value'"
					* runs only if the user defined adec is absent for that number
					*if `i'>`count' & `i'<. {
					
					* now runs only if adec is present at all
					if "`adec'"=="" {
						* auto-digits: auto( ), cannot check for decmark (decimal separator) because comma is used for parsing
						autodigits2 `value' `auto' `less'
						* needs to be less than 11
						local valstr = string(`value',"%12.`r(valstr)'")
						if "`valstr'"=="" {
							local valstr .
						}
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
					}
					else {
						* using previous ones if no other option
						if "`aadec'"=="" {
							local aadec `prvadec'
						}
						local valstr = string(`value',"%12.`aadec'f")
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
						local prvadec = `aadec'
					}
				}
				else {
					* it's a non-number
					local index=index(`"`valstr'"',"e(")
					if `index'~=0 {
						if `"``valstr''"'=="" {
							* put a dot in there
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'.`comma2'"'
							noi di in yel `"`valstr' does not exist; check {stata eret list}"'
						}
						else {
							* passthru `valstr'
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'``valstr''`comma2'"'
						}
					}
					else {
						* evaluate ``valstr''
						local value `"`valstr'"'
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
					}
				}
				
				local i = `i'+1
			}
			local addstat `"`newadd'"'
		}
		
		*** to deal with eq(auto)
		if `univar'==0 & "`equationsOption'"=="auto" {
			* this means run once, as if it was a single equation
			local univar 1
		}
		
		/*
		*** to deal with eq(auto)
		if `univar'==0 & "`equationsOption'"=="auto" {
			
			forval count=1/`eqnum' {
				
				local temp_eqname: word `count' of `eqlist'
				tempname temp_eq
				mat `temp_eq' = `b'[.,"`temp_eqname':"]
				
				local these: coleq `temp_eq'
				
				
				* remove roweq for explicit varlist
				mat colnames `temp_eq' = _:
				
				local names: colnames `temp_eq'
				*noi di "colnames `colnames'"
				*local bocols = colsof(`b_eq')
			}
		}
		*/
		
	if "`crosstab'"=="" & "`sum2'"=="" {
		*** ad hoc fixes for various multi-equation models
		if "`cmd'"=="mvreg" | "`cmd'"=="sureg" | "`cmd'"=="reg3" {
			local univar = 0 /* multivariate regression (multiple equations) */
			if "`onecol'" != "onecol" {
				mat `r2mat' = `ebnames' /* get column labels */
				local neq = e(k_eq)
				local depvar = "`eqlist'"
				if "`cmd'"=="mvreg" {
					local r2list = e(r2)
				}
				local eq = 1
				while `eq' <= `neq' {
					if "`cmd'"=="mvreg" {
						local r2str: word `eq' of `r2list'
						scalar `rsq' = real("`r2str'")
					}
					else {
						scalar `rsq' = e(r2_`eq')
					}
					mat `r2mat'[1,`eq'] = `rsq'
					local eq = `eq' + 1
				}
			}
			else {
				/* if onecol */
				local r2 = "nor2"	
				scalar `rsq' = .
			}
		} /* `rsq' after `r2list' to avoid type mismatch */
		
		else if "`adjr2'"=="adjr2" {
			scalar `rsq' = e(r2_a)
			if `rsq' == . {
				di in red "Adjusted R-squared (e(r2_a)) not defined; cannot use adjr2 option"
				exit 198
			}
		}
		else {
			scalar `rsq' = e(r2)
		}
		
		if ("`cmd'"=="intreg" | "`cmd'"=="svyintrg" | "`cmd'"=="xtintreg") {
			local depvar : word 1 of `depvar' /* 2 depvars listed */
		}
		
		* nolabels for anova and fracpoly
		*if ("`cmd'"=="anova" | `fracpol' | "`cmd'"=="nl") {
		if ("`cmd'"=="anova" | `fracpol' ) {
			/* e(fp_cmd)!=. means fracpoly */
			local cons "nocons"
		}
		
		*** margin or dprobit: substitute marginal effects into b and vc
		else if ("`cmd'"=="dprobit" | "`margin'"=="margin") {
			if "`cmd'"=="dlogit2" | "`cmd'"=="dprobit2" | "`cmd'"=="dmlogit2" {
				di in yellow "warning: margin option not needed"
			}
			else {
				marginal2, b(`b') vc(`vc') `se' `margucp'
				local bcols = colsof(`b') /* cols of b */
				local bocols = `bcols' /* cols of b only, w/o other stats */
				if "`cmd'"=="dprobit" {
					local cons "nocons"
				}
			}
		}
	} /* not crosstab or sum */
		
		
		*** to handle single or multiple equations
		local neq = `eqnum'
		local eqlist "`eqlist'"
		if "`onecol'"=="onecol" | `univar'==1 {
			if "`depvar'"=="" {
				local depvar: rowname `ebnames'
				*local depvar: word 1 of `depvar'
			}
		}
		
		local ctitleList `"`ctitle'"'
		
		*** the column title:
		* save the original ctitle for the first run and restore prior to each subsequent run
		if `estnum'==1 {
			local ctitleSave `"`ctitleList'"'
		}
		else {
			local ctitleList `"`ctitleSave'"'
		}
		
		local cttop_comma `"`cttop',"'
		
		*** clean up column titles
		* from current, non-stored estimates
		if (`univar'==1 | "`onecol'"=="onecol") & `estStored'==0 {
			if `"`ctitle0'"'=="" & `"`ctitleList'"'=="" {
				if `"`cttop'"'~="" {
					local ctitleList `"`cttop'"'
				}
				if `"`cttop'"'~="" & "`sum'"=="" & "`sum2'"=="" & "`crosstab'"=="" & "`tab3'"=="" {
					local ctitleList `"`cttop_comma'  `depvar'"'
				}
				
				if `"`cttop'"'=="" & "`sum'"=="" & "`sum2'"=="" & "`crosstab'"=="" & "`tab3'"=="" & "`onecol'"=="" {
					if "`sideway'"=="sideway" {
						local count: word count `statsList'
						if `count'>=1 & `count'<. & "`ctitle0'"=="" {
							local temp: word 1 of `statsList'
							local ctitleList `"`depvar', `temp'"'
							forval num=2/`count' {
								local temp: word `num' of `statsList'
								local ctitleList `"`ctitleList'; `temp'"'
							}
						}
						else {
							local ctitleList `"`depvar'"'
						}
					}
					else {
						* not a sideway
						local ctitleList `"`depvar'"'
					}
				}
			}
		}
		else {
			if `"`ctitle0'"'=="" & `estStored'==0 {
				if "`eqname'"~="" {
					* sometimes multiple depvar, i.e. reg3
					local count: word count `depvar'
					if `count'>=1 & `count'<. & "`ctitle0'"=="" {
						local temp: word 1 of `depvar'
						local ctitleList `"`eqname', `temp'"'
						forval num=2/`count' {
							local temp: word `num' of `depvar'
							local ctitleList `"`ctitleList' ; `eqname', `temp'"'
						}
					}
				}
				else {
					* sometimes multiple depvar, i.e. reg3
					local count: word count `depvar'
					if `count'>=1 & `count'<. {
						local temp: word 1 of `depvar'
						local ctitleList `"`ctitleList' `temp'"'
						forval num=2/`count' {
							local temp: word `num' of `depvar'
							local ctitleList `"`ctitleList' ; `temp'"'
						}
					}
				}
			}
			else if `"`ctitle0'"'=="" {
				* when from stored estimates
				local ctitleList=`"`estname', `depvar'"'
				if `"`eqname'"'~="" {
					local ctitleList=`"`estname', `eqname', `depvar'"'
				}
			}
		}
		
		if `"ctitleList'"'=="" {
			local ctitleList `"`depvar'"'					
		}
		
		*** when `ebnames' includes extra statistics (which don't have variable labels)
		capture mat `b_alone' = `b'[1,"`depvar':"]
		
		if _rc==0 {
			local bocols = colsof(`b_alone')
		}
		else if ("`cmd'"=="ologit" | "`cmd'"=="oprobit") {
			local bocols = e(df_m)
			mat `b_alone' = `b'[1,1..`bocols']
		}
		else if ("`cmd'"=="cnreg" | ("`cmd'"=="tobit" & "`margin'"~="margin")) {
			local bocols = `bocols'-1 /* last element of `ebnames' is not est coef */
			mat `b_alone' = `b'[1,1..`bocols']
		}
		else if ("`cmd'"=="intreg" | "`cmd'"=="svyintrg") {
			mat `b_alone' = `b'[1,"model:"]
			local bocols = colsof(`b_alone')
		}
		else if ("`cmd'"=="truncreg") {
			mat `b_alone' = `b'[1,"eq1:"]
			local bocols = colsof(`b_alone')
		}
		
		* keep these here for sideway option
		if "`statsListKeep'"=="" {
			local statsListKeep "`statsList'"
			local statsManyKeep "`statsMany'"
		}
		if "`ctitleListKeep'"=="" {
			local ctitleListKeep "`ctitleList'"
		}
		
		
		if "`Version7'"=="" {
			local eqlist "`eqlist7'"
		}
		
		
		*local count: word count `depvar'
		*if `count'>1 & `count'<. {
		*	local depvar=subinstr(`"`depvar'"',"  "," ",.)
		*	local depvar=subinstr(`"`depvar'"'," ",",",.)
		*}
		
		*** fix for xtpoisson
		if "`e(cmd)'"=="xtpoisson" {
			local eqsingle eqsingle
		}
		
		*** create table with makeFile and append to existing table
		* NOTE: makeFile command is rclass
		qui {
			cap preserve
			
			*** make univariate regression table (single equation or single column)
			if `univar'==1 | "`onecol'"=="onecol" | "`eqsingle'"=="eqsingle" {
				
				* changing the equation name of univariate case for housekeeping purposes
				if `univar'==1 & "`onecol'"=="onecol" {
					* attach equation marker for onecol output; it sorts better
					mat colnames `b'= "`depvar':"
				}
				
				*** sideway single equation
				
				if "`sideway'"=="sideway" {
					local sidewayRun "`statsManyKeep'"
					local statsMany 1
				}
				else {
					local sidewayRun 1
				}
				
				forval sidewayWave=1/`sidewayRun' {
					if "`sideway'"=="sideway" {
						* must do it by hand to handle cmd( ) - but "ad hoc" fix inside makeFile
						*local var: word `sidewayWave' of `statsListKeep'
						local statsTwo `"`statsListKeep'"'
						forval temp=1/`sidewayWave' {
							gettoken one statsTwo : statsTwo, `bind'
						}
						local var `"`one'"'
						local statsList `"`var'"'
						
						* parsing ctitleList contents (1.1 of 2), parsing by ";"
						local ctitleTwo `"`ctitleListKeep'"'
						
						forval temp=1/`=`sidewayWave'*2-1' {
							gettoken one ctitleTwo: ctitleTwo, `bind' parse(";")
						
						}
						local ctitleList `"`one'"'
						
						if "`onecol'"~="" {
							if `sidewayRun'==1 {
								*local ctitleList `"`cttop_comma'  Freq, (Percent)"'
							}
							else {
								if `sidewayWave'==1 {
									local ctitleList `" `ctitleList', `var'"'
								}
								else {
									local ctitleList `" `var'"'
								}
							}
						}
						if "`crosstab'"=="crosstab" {
							if `sidewayRun'==1 {
								local ctitleList `"`cttop_comma'  Freq, (Percent)"'
							}
							else {
								if `sidewayWave'==1 {
									local ctitleList `"`cttop_comma'  Freq"'
								}
								else {
									local ctitleList `"`cttop_comma'  Percent"'
								}
							}
						}
						else if `"`ctitleList'"'=="" & `"`cttop'"'~="" {
							if `sidewayWave'==1 {
								local ctitleList `"`cttop_comma'  `depvar', `var'"'
							}
							else {
								local ctitleList `"`var'"'
							}
						}
						else if `"`ctitleList'"'=="" {
							if `sidewayWave'==1 {
								local ctitleList "`depvar', `var'"
							}
							else {
								local ctitleList `"`var'"'
							}
						}
						if `"`ctitleList'"'=="" {
							local ctitleList `"`ctitleListKeep'"'
						}
					}
					else {
						* not sideway
						if "`crosstab'"=="crosstab" {
							local ctitleList `"`cttop_comma'  Freq, (Percent)"'
						}
					}
					
					* to avoid overwriting after the first time, append from the second time around (2 of 3)
					if `sidewayWave'==2 & "`replace'"=="replace" {
						local append "append"
						local replace ""
					}
					
				if "`Version7'"=="" {
					* it is version 7
					* b(`b') instead of b(`b_eq'), vc(`vc') instead of vc(`vc_eq')
					makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop') 					/*
						*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') 								/*
						*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
						*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
						*/ tdec(`tdec') 			pdec(`pdec') 										/*
						*/ rdec(`rdec') 			adec(`adec') 										/*
						*/ `paren' parenthesis(`parenthesis') `bracket'										/*
						*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' 				/*
						*/ ctitleList(`ctitleList') auto(`auto') `noauto'											/*
						*/ addstat(`addstat') addtext(`addtext') `notes'									/*
						*/ `addnote' `append' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
						*/ robust(`robust') borows(`bocols') b(`b') vc(`vc') 									/*
						*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
						*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
						*/ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave')
					* taken out: `se' `pvalue' `ci' `tstat'
				}
				else {
					* b(`b') instead of b(`b_eq'), vc(`vc') instead of vc(`vc_eq')
					makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop') inddrop(`inddrop')					/*
						*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') 								/*
						*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
						*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
						*/ tdec(`tdec') tfmt(`tfmt') pdec(`pdec') pfmt(`pfmt') 								/*
						*/ rdec(`rdec') rfmt(`rfmt') adec(`adec') afmt(`afmt')								/*
						*/ `paren' parenthesis(`parenthesis') `bracket'										/*
						*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' 				/*
						*/ ctitleList(`ctitleList') auto(`auto') `noauto'											/*
						*/ addstat(`addstat') addtext(`addtext') `notes'									/*
						*/ `addnote' `append' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
						*/ robust(`robust') borows(`bocols') b(`b') vc(`vc') 									/*
						*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
						*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
						*/ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave') decmark(`decmark') /*
						*/ `eqsingle' stnum(`stnum') ststr(`ststr')
					* taken out: `se' `pvalue' `ci' `tstat'
				}
					
					*if "`append'"~="append" {
					if "`append'"~="append" & `sidewayWave'==1 {
						* replace
						
						sleep `slow'	/* wait 1000 ms = 1 second before trying again */
						outsheet report reportCol `using', nonames `quote' `comma' replace
						local fileExist 1
					}
					
					else {
						*** appending
						* confirm the existence of the output file
						local rest "`using'"
						* strip off "using"
						gettoken part rest: rest, parse(" ")
						if `fileExist'==1 {
							appendFile `using',   titlefile(`titlefile') /*
								*/`sideway' `onecol' sortcol(`sortcol') sortvar(`sortvar') groupvar(`groupvar') `quote' `comma' slow(`slow')
							
							sleep `slow'	/* wait 1000 ms = 1 second before trying again */
							outsheet v* reportCol `using', nonames `quote' `comma' replace
							*drop v*
						}
						else {
							* does not exist and therefore needs to be created
							sleep `slow'	/* wait 1000 ms = 1 second before trying again */
							outsheet report reportCol `using', nonames `quote' `comma' replace
							local fileExist 1
						}
					}
					restore, preserve
				} /* sideway single equation */
			}
			
			*** make multiple equation regression table (wide format)
			else {
				
				tempname b_eq vc_eq
				
				* getting the depvar list from eqlist
				local eq = 1
				while `eq' <= `neq' {
					
					local eqname: word `eq' of `eqlist'
					local depvar: word `eq' of `eqlist'
					
					if `eq'==1 {
						if `estStored'==1 & "`estname'"~="" {
							if `"`ctitle0'"'=="" & `eq'==1 {
								local ctitleList "`estname', `depvar'"
							}
						}
						else {
							if `"`cttop'"'~="" {
								local ctitleList "`cttop_comma'  `depvar'"
							}
							else {
								local ctitleList "`depvar'"
							}
						}
					}
					else {
						* subsequent columns
						if `estStored'==1 & "`estname'"~="" {
							local ctitleList ", `depvar'"
						}
						else {
							local ctitleList "`depvar'"
						}
					}
					
					*** r2mat doesn't exist for mlogit ="capture" 
					capture scalar `rsq' = `r2mat'[1,`eq']
					mat `b_eq' = `b'[.,"`eqname':"]
					
					* remove roweq from b_eq for explicit varlist
					matrix colnames `b_eq' = _:
					mat `vc_eq' = `vc'["`eqname':","`eqname':"]
					local bocols = colsof(`b_eq')
					
					*** sideway multiple equation
					
					if "`sideway'"=="sideway" {
						local sidewayRun "`statsManyKeep'"
						local statsMany 1
					}
					else {
						local sidewayRun 1
					}
					
					forval sidewayWave=1/`sidewayRun' {
						if "`sideway'"=="sideway" {
							* must do it by hand to handle cmd( ) - but "ad hoc" fix inside makeFile
							*local var: word `sidewayWave' of `statsListKeep'
							local statsTwo `"`statsListKeep'"'
							forval temp=1/`sidewayWave' {
								gettoken one statsTwo : statsTwo, `bind'
							}
							local var `"`one'"'
							local statsList "`var'"
							
							
							* parsing ctitleList contents (1.2 of 2), parsing by ";"
							local ctitleTwo `"`ctitleListKeep'"'
							forval temp=1/`=`sidewayWave'*2-1' {
								gettoken one ctitleTwo: ctitleTwo, `bind' parse(";")
							}
							local ctitleList1 `"`ctitleList', `one'"'
							
							
							local ctitleList1 `"`ctitleList'"'
							if `"`ctitleList1'"'=="" {
								local ctitleList1 "`var'"
							}
						}
						else {
							local ctitleList1 `"`ctitleList'"'
						}
						
						* to avoid overwriting after the first time, append from the second time around (3 of 3)
						if `sidewayWave'==2 & "`replace'"=="replace" {
							local append "append"
							local replace ""
						}
						
						if `eq'>1 & `sidewayWave'>1 {
							local addstat ""
						}
						
						if `eq' == 1 & "`append'"!="append" & `sidewayWave'==1 {
							local apptmp ""
						}
						else {
							local apptmp "append"
						}
						
					if "`Version7'"=="" {
						* it is version 7
						makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop')					/*
							*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist')									/*
							*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
							*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
							*/ tdec(`tdec') 			pdec(`pdec') 										/*
							*/ rdec(`rdec') 			adec(`adec') 										/*
							*/ `paren' parenthesis(`parenthesis') `bracket'										/*
							*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2'				/*
							*/ ctitleList(`ctitleList1') auto(`auto') `noauto'											/*
							*/ addstat(`addstat') addtext(`addtext') `notes'									/*
							*/ `addnote' `apptmp' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
							*/ robust(`robust') borows(`bocols') b(`b_eq') vc(`vc_eq') 								/*
							*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
							*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
							*/ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave')
						* taken out: `se' `pvalue' `ci' `tstat'
					}
					else {
						makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop') inddrop(`inddrop')					/*
							*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist')									/*
							*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
							*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
							*/ tdec(`tdec') tfmt(`tfmt') pdec(`pdec') pfmt(`pfmt') 								/*
							*/ rdec(`rdec') rfmt(`rfmt') adec(`adec') afmt(`afmt')								/*
							*/ `paren' parenthesis(`parenthesis') `bracket'										/*
							*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2'				/*
							*/ ctitleList(`ctitleList1') auto(`auto') `noauto'											/*
							*/ addstat(`addstat') addtext(`addtext') `notes'									/*
							*/ `addnote' `apptmp' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
							*/ robust(`robust') borows(`bocols') b(`b_eq') vc(`vc_eq') 								/*
							*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
							*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
							*/ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave') decmark(`decmark')  /*
							*/ `eqsingle' stnum(`stnum')  ststr(`ststr')
						* taken out: `se' `pvalue' `ci' `tstat'
					}
					
						* create new file: replace and the first equation		
						if `eq' == 1 & "`append'"!="append" & `sidewayWave'==1 {
							sleep `slow'	/* wait 1000 ms = 1 second before trying again */
							outsheet report reportCol `using', nonames `quote' `comma' `replace'
							local fileExist 1
						}
						* appending here: another estimates or another equation
						else {
							* confirm the existence of the output file
							local rest "`using'"
						 	* strip off "using"
							gettoken part rest: rest, parse(" ")
							if `fileExist'==1 {
								* it exists: keep on appending even if it's the first equation
								appendFile `using', titlefile(`titlefile') `sideway' /*
									*/ `onecol' sortcol(`sortcol') sortvar(`sortvar') groupvar(`groupvar') `quote' `comma' slow(`slow')
								sleep `slow'	/* wait 1000 ms = 1 second before trying again */
								outsheet v* reportCol `using', nonames `quote' `comma' replace
								*drop v*
							}
							else {
								* does not exist and specified append: need to be created for the first equation only
								*if `eq' == 1 & "`append'"=="append" {
								if `eq' == 1 & "`append'"=="append" & `sidewayWave'==1 {
									sleep `slow'	/* wait 1000 ms = 1 second before trying again */
									outsheet report reportCol `using', nonames `quote' `comma' `replace'
									local fileExist 1
								}
							}
						}
						
						restore, preserve
					}  /* sideway multiple equation */
					
					local eq = `eq' + 1
					
					*restore, preserve /* to access var labels after first equation */
				}
			}	
		}		/* for quietly */
	}		/* run each estimates consecutively */
	
	
	quietly {
		
		*** clean the files to be preared for output
		if "`pivot'"=="pivot" {
			
			*** pivot and xpose here
			_sxpose `using', `quote' `comma' title(`title') titlefile(`titlefile') `label' /*
				*/ labelOption(`labelOption')
			* c_locals titleWide headRow bottomRow
		}
		else {
			cleanFile `using', `quote' `comma' title(`title') titlefile(`titlefile') `label' /*
				*/ labelOption(`labelOption') slow(`slow')
			* c_locals titleWide headRow bottomRow
		}
		
		
		*** preparing for outputs and seeout
		ren v1 coef
		cap ren v0 eq
		
		unab vlist : v*
		local count: word count `vlist'
		forval num=1/`count' {
			local vname: word `num' of `vlist'
			ren `vname' v`num'
		}
		
		
		* number of columns
		describe, short
		local numcol = `r(k)'
		
		
		tempvar blanks rowmiss
		gen int `blanks' = (trim(v1)=="")
		
		foreach var of varlist v* {
			replace `blanks' = `blanks' & (trim(`var')=="")
		}
		
		replace `blanks'=0 if coef==`"`VARIABLES'"' | coef[_n-1]==`"`VARIABLES'"'
		
		* fix blanks==1 for groupvar( )
		count if `blanks'==1
		local rN=`r(N)'+1
		forval num=1/`rN' {
			replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1
		}
		
		* headBorder & bottomBorder
		local headBorder=`headRow'+`titleWide'
		local bottomBorder=`bottomRow'+`titleWide' /* add eqAdded later */
		
		
		*** making alternative output files
		if "`long'"=="long" | "`excel'"=="excel" | "`word'"=="word" | `tex'==1 | "`dta'"=="dta" | "`dtaa'"~="" | "`text'"=="text" | "`pivot'"=="pivot" {
			
			if "`text'"=="text" | ("`long'"=="long" & "`onecol'"=="onecol") {
				local dot=index(`"`using'"',".")
				if `dot'~=0 {
					local before=substr(`"`using'"',1,`dot'-1)
					local after=substr(`"`using'"',`dot'+1,length("`using'"))
					
					*local usingLong=`"`before'_long.`after'"'
					local usingLong=`"`before'_exact.`after'"'
				}
			}
			
			local eq_exist
			capture confirm variable eq
			*if _rc~=0 & "`long'"=="long" {
			*	noi di in yellow "equation not detected; {opt long} may not be needed"
			*}
			
			*** convert the data into long format (insert the equation names if they exist)
			if _rc==0 & "`long'"=="long" & "`onecol'"=="onecol" {		
				* a routine to insert equation names into coefficient column
				count if `blanks'==0 & eq~="" & eq~="EQUATION"
				
				gen float id5=_n
				local _firstN=_N
				set obs `=_N+`r(N)''
				local times 1
				forval num=2/`_firstN' {
					if eq[`num']~="" & eq[`num']~="EQUATION" {
						replace id5=`num'-.5 in `=`_firstN'+`times''
						local times=`times'+1
					}
				}
				* eqAdded here:
				local bottomBorder=`bottomBorder'+`r(N)'

				count if `blanks'==0 & eq~="" & eq~="EQUATION"
				local _firstN=_N
				set obs `=_N+`r(N)''
				local times 1
				forval num=2/`_firstN' {
					if eq[`num']~="" & eq[`num']~="EQUATION" {
						replace id5=`num'-.75 in `=`_firstN'+`times''
						replace coef=eq[`num'] in `=`_firstN'+`times'' 
						local times=`times'+1
					}
				}
				
				
				sort id5
				
				drop eq id5 `blanks'
				
				* change `bottomBorder' by the number of equations inserted
				local bottomBorder=`bottomBorder'+`r(N)'
				
				* v names
				unab vlist : *
				local count: word count `vlist'
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren `vname' c`num'
				}
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren c`num' v`num'
				}
				
				if "`text'"=="text" {
					sleep `slow'	/* wait 1000 ms = 1 second before trying again */
					outsheet v* `usingLong', nonames `quote' `comma' replace
				}
				
			} /* long format */
			
			else {
				drop `blanks'
				
				* v names
				unab vlist : *
				local count: word count `vlist'
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren `vname' c`num'
				}
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren c`num' v`num'
				}
			}
			
			*** label replacement
			if "`label'"=="label" {
				if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") {
					replace v2=v1 if v2==""
					drop v1
					describe, short
					forval num=1/`r(k)' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES in 1/3
					replace v1=`"`VARIABLES'"' if v1=="LABELS"
				}
				else if "`long'"~="long" & "`onecol'"=="onecol" {
					replace v3=v2 if v3==""
					drop v2
					describe, short
					forval num=2/`r(k)' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES
					replace v2=`"`VARIABLES'"' if v2=="LABELS"
				}
				
				* create new text file
				* do it for _long file as well
				if "`text'"=="text" {
					
				}
			}
			
			tempfile outing
			save `"`outing'"'
			
			
			*** Pivot thing
			if "`pivot'"=="pivot" {
				* produce verbatim text
				
			}
			
			
			*** Text thing
			if "`text'"=="text" & "`label'"=="label" {
				* produce verbatim text
				sleep `slow'	/* wait 1000 ms = 1 second before trying again */
				outsheet v* `usingLong', nonames `quote' `comma' replace
			}
			
			*** LaTeX thing
			if `tex' {
				
				* make certain `1' is not `using' (another context)
				
				_texout v* using `"`strippedname'"', texFile(`texFile') titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') `texopts' replace
				
				if `"`texFile'"'=="" {
					local endName "tex"
				}
				else {
					local endName "`texFile'"
				}
				
				local usingTerm `"`strippedname'.`endName'"'
				
				c_local cl_tex `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"'
				*noi di as txt `"`cl_tex'"'
			}
			
			*** Word rtf file thing
			if "`word'"=="word" {
				use `outing',clear
				
				* there must be varlist to avoid error
				*out2rtf2 v* `using',  titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty
				out2rtf2 v* using `"`strippedname'"', wordFile(`wordFile') titleWide(`titleWide') /*
					*/ headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty
				local temp `r(documentname)'
				
				* strip off "using" and quotes
				gettoken part rest: temp, parse(" ")
				gettoken usingTerm second: rest, parse(" ")
				
				*local cl `"{stata shell winexec cmd /c tommy.rtf & exit `usingTerm' & EXIT :`usingTerm' }"'
				* these work but leaves the window open
				*local cl `"{stata winexec cmd /c "`usingTerm'" & EXIT :`usingTerm'}"'
				*local cl `"{stata shell "`usingTerm'" & EXIT :`usingTerm'}"'
				*local cl `"{stata shell cmd /c "`usingTerm'" & EXIT :`usingTerm'}"'
				
				c_local cl_word `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"'
				*noi di as txt `"`cl_word'"'
			}
			
			*** Excel xml file thing
			if "`excel'"=="excel" {
				use `outing',clear
				
				*xmlsave `"`strippedname'.xml"',doctype(excel) replace legible
				_xmlout using `"`strippedname'"', excelFile(`excelFile') nonames titleWide(`titleWide') /*
					*/ headBorder(`headBorder') bottomBorder(`bottomBorder') 
				
				if `"`excelFile'"'=="" {
					local endName "xml"
				}
				else {
					local endName "`excelFile'"
				}
				
				local usingTerm `"`strippedname'.`endName'"'
				
				*c_local cl_excel `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"'
				c_local cl_excel `"{browse `"`usingTerm'"'}"'
				*noi di as txt `"`cl_excel'"'
			}
			
			*** Stata dta file thing
			if "`dta'"=="dta" | "`dtaa'"~="" {
				use `outing',clear
				if "`dtaa'"~="" {
					if "`dtaa'"=="saveold" {
						saveold "`strippedname'_dta", replace
					}
					else {
						noi di in red "`dtaa' is not a vaild sub-option for {opt dta( )}" 
						exit 198
					}
				}
				else {
					save "`strippedname'_dta", replace
				}
				*c_local cl_dta `"{stata "`strippedname'_dta.dta":dta}"'
				*c_local cl_dta `"{stata `"seeout using "`strippedname'_dta", dta"':dta}"'
			}
		} /* output files */
	}  /* quietly */


* re-clean to get each options returned
optionSyntax, valid(insert upper lower proper) name(labelA) nameShow(label( )) content(`labelOption')

*** see the output
if "`label'"=="label" | "`insert'"=="insert" {
	if "`seeout'"=="seeout" {
		if "`label'"=="label" {
			seeing `using', label
		}
		else {
			seeing `using', label(`insert')
		}
	}
	if "`label'"=="label" {
		c_local cl_see `"{stata `"seeout using `file', label"':seeout}"'
	}
	else {
		c_local cl_see `"{stata `"seeout using `file', label(`insert')"':seeout}"'
	}
	*di as txt `"`cl'"'
}
else {
	if "`seeout'"=="seeout" {
		seeing `using'
	}
	c_local cl_see `"{stata `"seeout using `file'"':seeout}"'
	*di as txt `"`cl'"'
}

end		/* end of _outreg2 */


********************************************************************************************


prog define appendFile
* previously appfile2

	versionSet
	version `version'

* append regression results to pre-existing file

syntax using/, titlefile(string) [sideway onecol sortcol(string) sortvar(string) groupvar(string) /*
	*/  noQUOte comma slow(numlist)]

*** take out VARIABLES as the column heading and restore later
*local VARIABLES2 "`variables'"

* first name is the VARIABLES
local content
local num 1
local N=_N
while `"`content'"'=="" & `num'<=`N' {
	local content=report[`num']
	local num=`num'+1
}
local VARIABLES2 `"`content'"'
replace report = "" if report==`"`VARIABLES2'"' & rowtype2==-1


* column number rows
* pre-create Vorder here
gen Vorder2=0 if rowtype2==0
while Vorder2[1]==. {
	replace Vorder2=Vorder2[_n+1]-1 if rowtype2==-1
}
egen min=min(Vorder2)
replace Vorder2=-99 if Vorder2==min
drop min

* Constant is now done as eqOrder0 + .5
*replace Vorder2=2 if report=="Constant" /* ok because equation names would still be attached if present */

* orders bottom row, Observations, r2, and else
replace Vorder2=3.8 if rowtype2>=2 
replace Vorder2=Vorder2[_n-1]+.0001 if Vorder2>=3.8 & rowtype2==3
replace Vorder2=2 if rowtype2==2
replace Vorder2=3.5 if report=="Observations"
replace Vorder2=3.6 if report=="R-squared"

replace Vorder2=1 if Vorder2==. & (Vorder2[_n-1]<1 | Vorder2[_n-1]==1)
replace Vorder2=2.5 if report=="" & (Vorder2[_n-1]==2 | Vorder2[_n-1]==2.5)


* genderate eq_order2 (handles Constant within each equation)
local N=_N
gen eq_order2=0 in 3/`N' if eqname~=""
replace eq_order2=1 in 3/`N' if eqname[_n]~=eqname[_n-1] & eqname~=""
replace eq_order2=eq_order2+eq_order2[_n-1] if eq_order2+eq_order2[_n-1]~=.

* generating order within each coefficient, use sortvar( ) if available
gen Vorder2_0=.
local maxnum 1
if "`sortvar'"~="" {
	tokenize `sortvar'
	local num 1
	while "``num''"~="" {
		replace Vorder2_0=`num' if varname=="``num''"
		local num=`num'+1
	}
	if `num'>`maxnum' {
		local maxnum `num'
	}
}

* the evil twin of sortvar that will insert blanks/groups as well as order the existing variables 
if "`groupvar'"~="" {
	* stats rows per variable
	count if report~="" & rowtype2==1
	local nom `r(N)'
	count if rowtype2==1
	if `nom'~=0 {
		local rN=`r(N)'
		*local many=int(round(`rN'/`nom'))
		local many=int(round(`rN'/`nom',1))
	}
	else {
		local many 2
	}
				
				* eqnames for multiple equation
				tab eqname if rowtype2==1
				local rr=`r(r)'
				local tempList
				local orderlist
				if `rr'> 0 {
					* get eq names
					
					gen str5 temp=""
					replace temp=eqname if eqname~=eqname[_n-1] & rowtype2==1
					sort temp
					local N=_N
					forval num=1/`rr' {
						local content=temp[`N'-`num'+1]
						local tempList="`tempList' `content'"
						local content=eq_order2[`N'-`num'+1]
						local orderlist="`orderlist' `content'"
					}
					drop temp
					sort mrgrow
					local times `rr'
				}
				else {
					* it's a single equation, run it once
					local times 1
				}
				
				
	tokenize `groupvar'
	forval kk=1/`times' {
		local order: word `kk' of `orderlist'
		local temp: word `kk' of `tempList'
		
		local num 1
		local count0 0
		while "``num''"~="" & "``num''"~=" " {
			replace Vorder2_0=`num' if varname=="``num''" & eqname=="`temp'"
			count if Vorder2_0~=. & eqname=="`temp'"
			if `r(N)'==`count0' {
				forval cc=1/`many' {
					* insert this many blank var
					local N=_N
					set obs `=`N'+1'
					local N=_N
					if `cc'==1 {
						replace report="``num''" in `N'
					}
					replace varname="``num''" in `N'
					replace rowtype2=1 in `N'
					replace Vorder2=1 in `N'
					replace Vorder2_0=`num' in `N'
					
					* for multiple equation only
					if `rr'>0 {
						if `cc'==1 {
							replace report="`temp':" + report in `N'
						}
						replace eq_order2=`order' in `N'
						replace eqname="`temp'" in `N'
					}
				}
			}
			count if Vorder2_0~=. & eqname=="`temp'"
			local count0 `r(N)'
			local num=`num'+1
		}
		if `num'>`maxnum' {
			local maxnum `num'
		}
	}
}


* own column to handle sortvar (to handle in mutliple equation)
gen sortvarCol2=Vorder2_0

gen temp=_n
replace Vorder2_0 = temp+`maxnum' if Vorder2==1 & report~="" & Vorder2_0==.
replace Vorder2_0 = Vorder2_0[_n-1]     if Vorder2_0==. & Vorder2==1
drop temp

replace sortvarCol2=Vorder2_0 if sortvarCol2~=.

gen double Vorder2_1 = Vorder2_0 if Vorder2==1 & report~=""
replace Vorder2_1 = Vorder2_1[_n-1]+.01 if Vorder2_1==. & Vorder2==1

* for groupvar( ) above
sort Vorder2 eq_order2 Vorder2_1 mrgrow
replace mrgrow=_n


tempfile tmpf1

gen str8 mergeOn = ""
replace mergeOn = report				/* room for "!" at end */

gen str8 varsml=""
replace varsml = trim(mergeOn)

* fill the spaces between the names
local N=_N

replace mergeOn = mergeOn[_n-1]+"!" if varsml==""
replace mergeOn = "bottomRow" if rowtype2==2
replace mergeOn = "topRow" if rowtype2==0
replace mergeOn = "_000" if rowtype2==-1
gen varnum = Vorder2 if Vorder2<1

* add "!" to variable name to make it sort after previous variable name
* will cause bug if both "varname" and "varname!" already exist

count if (varsml=="" | (varsml[_n+1]=="" & _n!=_N))
local ncoeff2 = r(N)				/* number of estimated coefficients in file 2 */
local N2 = _N					/* number of lines in file 2 */
gen Vord2 = _n					/* ordering variable for file 2 */

ren varname VarName2
ren eqname eqName2

drop varsml

* eqname vs eqName2
keep report reportCol mergeOn varnum Vord2 Vorder2 Vorder2_0 Vorder2_1 VarName2 eqName2 eq_order2 rowtype2 sortvarCol2

tempfile mergeVarFile mergeEqFile
gen str8 mergeVar=""
gen str8 mergeEq=""

* two sorting/merging mechanism
local N=_N
count if eqName2=="" | eqName2=="EQUATION"
if `N'==`r(N)' {
	* single equation
	local usingSingle 1
	replace mergeVar=mergeOn
	
	sort mergeVar varnum
	save `mergeVarFile', replace
}
else {
	* multiple equations
	local usingSingle 0
	replace mergeEq=mergeOn
	
	replace mergeVar = mergeOn
	replace mergeVar = VarName2 if VarName2~="" & Vorder2==1
	replace mergeVar = "Constant" if VarName2=="_cons" &  Vorder2==1
	replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder2==1
	
	sort mergeVar varnum
	save `mergeVarFile', replace
	
	sort mergeEq varnum
	save `mergeEqFile', replace
}




*** prepare the original file for merging

if "`Version7'"=="" {
	* it is version 7
	sleep `slow'	/* wait 1000 ms = 1 second before trying again */
	insheet using `"`using'"', nonames clear
}
else {
	* requires 8 or above
	_chewfile using `"`using'"', semiclear
	local num 1
	foreach var of varlist _all {
		ren `var' v`num'
		local num=`num'+1
	}
}

if "`sideway'"=="sideway" {
	* if sideway, need to split eqname and varname, no label or title here
	cleanFile using `"`using'"', `quote' `comma' notitle slow(`slow')
	
	* get ride of v0 in case of equation
	sleep `slow'	/* wait 1000 ms = 1 second before trying again */
	insheet using `"`using'"', nonames clear
}

*** save equation column if it exists before dropping it
local exists_eq=0
count if v1=="EQUATION"
if `r(N)'~=0 {
	gen str8 v0=""
	replace v0=v1
	local exists_eq=1
	drop v1
	* count v0 as well
	describe, short
	forval num=2/`r(k)' {
		ren v`num' v`=`num'-1'
	}
}

*** strip labels columns
count if v2=="LABELS"
if `r(N)'~=0 {
	drop v2
	* count v0 as well
	* cap is added to avoid the last column v0 being misnamed
	describe, short
	forval num=2/`r(k)' {
		cap ren v`=`num'+1' v`num'
	}
}

*** save title first one only, before stripping coef columns
cap save `titlefile'

*** must drop title first
if `exists_eq'==1 {
	if v0[1]~="" {
		* there may be a title
		while v0[1]~="" & v2=="" {
			drop in 1
		}
	}
}
if v1[1]~="" {
	* there may be a title
	while v1[1]~="" & v2=="" {
		drop in 1
	}
}	


*local VARIABLES "`variables'"
* first name is the VARIABLES
local content
local num 1
local N=_N
while `"`content'"'=="" & `num'<=`N' {
	local content=v1[`num']
	local num=`num'+1
}
local VARIABLES1 `"`content'"'


*** drop titles and establish the top row
*egen `rowmiss'=rowmiss(_all)
* rowmiss option not available in 8.2 or 8.0, do it by hand
gen rowmiss=0
foreach var of varlist v* {
	replace rowmiss=rowmiss+1 if `var'~=""
}

* rowmiss will not catch if ctitles are blank for the first column (1), count down from the top (already done for VARIABLES1)
*replace rowmiss=1 if v1[_n-1]~="VARIABLES"
replace rowmiss=1 if v1[_n-1]~=`"`VARIABLES1'"'

* NOTE: "VARIABLES" is no longer taken off; it merely gets written over in the same spot later on
while v1[1]~="" & rowmiss==1 {
	drop in 1
}

*** finish cleaning the equation columns

gen str8 VarName1=""
gen str8 eqName1=""

gen rowtype1=-1
replace rowtype1=0 if rowmiss==0
replace rowtype1=999 if rowmiss[_n-1]==0 | rowtype1[_n-1]==999
replace rowtype1=. if rowtype1==999
drop rowmiss


*** establish the bottom row
local N=_N
local num = `N'
local temp=v1[`num']
while `"`temp'"'~="" & `num'>=1 {
	* keep counting until empty
	local num=`num'-1
	local temp=v1[`num']
}
else {
	* already empty
	local num=`num'-1
}

local num=`num' + 1
replace rowtype1= 1 if rowtype1==.
replace rowtype1= 2 if _n==`num'
replace rowtype1= 3 if _n>`num'


if "`exists_eq'"=="1" {
	*** Strip the equation names and slap it back onto the variable column
	local N=_N
	order v0
	
	replace v0=v0[_n-1] if v0=="" & v0[_n-1]~="" & rowtype1==1
	gen eq_order1=0 if rowtype1==1
	replace eq_order1=1 if v0[_n]~=v0[_n-1] & v0~="" & rowtype1==1
	replace eq_order1=1 if v0[_n]~=v0[_n-1] & v0~="" & rowtype1==1
	
	replace eq_order1=eq_order1+eq_order1[_n-1] if eq_order1+eq_order1[_n-1]~=.
	
	replace eqName1=v0
	replace VarName1=v1
	replace VarName1=VarName1[_n-1] if VarName1=="" & VarName1[_n-1]~="" & rowtype1==1
	replace v1=v0 + ":" + v1 if v0~="" & v1~="" & rowtype1==1
	
	drop v0
}

* not needed, replaced with colonSplit
/*else if "`sideway'"=="sideway" & "`onecol'"=="onecol" {
	* special case for sideway and onecol
	* because sideway loops internally, EQUATION and LABELS columns does not exist
	* eqname and varname are still joined, they need to separated
	* v1 is as it should be
	
	*** borrowed from:
	*** clean up equation names, title, label
	gen id1=_n
	gen str8 equation=""
	gen str8 variable=""
	
	local N=_N
	forval num=1/`N' {
		local name=trim(v1[`num'])
		local column=index("`name'",":")
		if `column'~=0 {
			local equation=trim(substr("`name'",1,`column'-1))
			local variable=trim(substr("`name'",`column'+1,length("`name'")))
			replace equation="`equation'" in `num'
			replace variable="`variable'" in `num'
		}
	}
	replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & rowtype1~=2
	
	replace eqName1=equation if equation~=""
	replace VarName1=variable if variable~=""
	drop equation variable id1
	
	local N=_N
	gen eq_order1=0 in 3/`N' if eqName1~=""
	replace eq_order1=1 in 3/`N' if eqName1[_n]~=eqName1[_n-1] & eqName1~=""
	replace eq_order1=eq_order1+eq_order1[_n-1] if eq_order1+eq_order1[_n-1]~=.
}
*/
else {
	*** eq names not present
	gen eq_order1=1
	replace eq_order1=. if rowtype1==2
}




*** take out COEFFICIENT/VARIABLES as the column heading and restore later
replace v1 = "" if rowtype1==-1

* getting the characteristics
describe, short
*local numcol = `r(k)'				/* number of columns already in file 1 */

* subtract 4 to account for eq_order1, VarName1, eqName1, rowtype1
local numcol = `r(k)'-4				/* number of columns already in file 1 */

gen str8 mergeOn = ""
replace mergeOn=v1
local titleWide = (v1[1]!="")

* `titleWide'	is assumed to be zero
local frstrow = 1 + `titleWide'			/* first non-title row */

gen long Vord1 = _n
gen str8 v2plus = ""
replace v2plus=trim(v2)

local col = 3
if `col'<=`numcol' {
	replace v2plus = v2plus + trim(v`col')
	local col = `col'+1
}

gen topoff=1 if v1~=""
replace topoff=1 if topoff[_n-1]==1
replace topoff=sum(topoff)
count if (topoff==0 | (v1=="" & v2plus!="") | (v1[_n+1]=="" & (v2plus[_n+1]!=""|_n==1) & _n!=_N))
drop topoff

local ncoeff1 = r(N)

gen str8 varsml=""
replace varsml = trim(mergeOn)

summ Vord1 if Vord1>`ncoeff1' & v2plus!=""	/* v2plus for addstat */
local endsta1 = r(max)					/* calc last row of statistics before notes */

if `endsta1'==. {
	local endsta1 = `ncoeff1'
}

replace mergeOn = mergeOn[_n-1]+"!" if varsml==""
replace mergeOn = "bottomRow" if rowtype1==2
replace mergeOn = "topRow" if rowtype1==0
replace mergeOn = "_000" if rowtype1==-1

* pre-create Vorder here
*gen Vorder1 = _n/100 if rowtype1==-1
*replace Vorder1 = .99 if rowtype1==0
gen Vorder1=0 if rowtype1==0

local mm 1
while Vorder1[1]==. & `mm'<100 {
	local mm=`mm'+1
	replace Vorder1=Vorder1[_n+1]-1 if rowtype1==-1
}

egen min=min(Vorder1)
replace Vorder1=-99 if Vorder1==min
drop min

gen varnum = Vorder1 if Vorder1<1

* Constant is now done as eqOrder0 + .5
*replace Vorder1=2 if v1=="Constant" /* ok because equation names would still be attached if present */

* orders bottom row, Observations, r2, and else
replace Vorder1=3.7 if rowtype1>=2 
replace Vorder1=Vorder1[_n-1]+.0001 if Vorder1>=3.7 & rowtype1==3
replace Vorder1=2 if rowtype1==2
replace Vorder1=3.5 if v1=="Observations"
replace Vorder1=3.6 if v1=="R-squared"

replace Vorder1=1 if Vorder1==. & (Vorder1[_n-1]<1 | Vorder1[_n-1]==1)
* a fix for addstat sorting Jan 2009
*replace Vorder1=4 if v2=="" & Vorder1==3.5
replace Vorder1=4 if v2=="" & v2plus=="" & Vorder1>3.5

* Constant is now done as eqOrder0 + .5
*replace Vorder1=2.5 if v1=="" & (Vorder1[_n-1]==2 | Vorder1[_n-1]==2.5)

* generating order within each coefficient, use sortvar( ) if available
gen Vorder1_0=.
local maxnum 1
if "`sortvar'"~="" {
	tokenize `sortvar'
	local num 1
	while "``num''"~="" {
		replace Vorder1_0=`num' if v1=="``num''" | VarName1=="``num''" & Vorder1==1
		local num=`num'+1
	}
	if `num'>`maxnum' {
		local maxnum `num'
	}
}

* the evil twin of sortvar that will insert blanks/groups as well as order the existing variables 
if "`groupvar'"~="" {
	* stats rows per variable
	count if v1~="" & rowtype1==1
	local nom `r(N)'
	count if rowtype1==1
	if `nom'~=0 {
		local many=int(round(`r(N)'/`nom'),1)
	}
	else {
		local many 2
	}
				
				* eqnames for multiple equation
				tab eqName1 if rowtype1==1
				local rr=`r(r)'
				local tempList
				local orderlist
				if `rr'> 0 {
					* get eq names
					
					gen str5 temp=""
					replace temp=eqname if eqname~=eqname[_n-1] & rowtype1==1
					sort temp
					local N=_N
					forval num=1/`rr' {
						local content=temp[`N'-`num'+1]
						local tempList="`tempList' `content'"
						local content=eq_order1[`N'-`num'+1]
						local orderlist="`orderlist' `content'"
					}
					drop temp
					sort Vord1
					local times `rr'
				}
				else {
					* it's a single equation, run it once
					local times 1
				}
				
	tokenize `groupvar'
	forval kk=1/`times' {
		local order: word `kk' of `orderlist'
		local temp: word `kk' of `tempList'
		
		local num 1
		local count0 0
		while "``num''"~="" {
			
			replace Vorder1_0=`num' if (v1=="``num''" | VarName1=="``num''" ) & eqName1=="`temp'"
			count if Vorder1_0~=. & eqName1=="`temp'"
			if `r(N)'==`count0' {
				forval cc=1/`many' {
					* insert this many blank var
					local N=_N
					set obs `=`N'+1'
					local N=_N
					if `cc'==1 {
						replace v1="``num''" in `N'
					}
					replace VarName1="``num''" in `N'
					replace rowtype1=1 in `N'
					replace Vorder1=1 in `N'
					replace Vorder1_0=`num' in `N'
					
					* for multiple equation only
					if `rr'>0 {
						if `cc'==1 {
							replace v1="`temp':" + v1 in `N'
						}
						replace eq_order1=`order' in `N'
						replace eqname="`temp'" in `N'
					}
				}
			}
			count if Vorder1_0~=. & eqName1=="`temp'"
			local count0 `r(N)'
			local num=`num'+1
		}
		if `num'>`maxnum' {
			local maxnum `num'
		}
	}
}

* must be filled:
replace mergeOn=v1 if Vord1==.
replace mergeOn=mergeOn[_n-1]+"!" if Vord1==. & mergeOn==""

* own column to handle sortvar (to handle in mutliple equation)
gen sortvarCol1=Vorder1_0

gen temp=_n
replace Vorder1_0 = temp+`maxnum' if Vorder1==1 & varsml~="" & Vorder1_0==.
replace Vorder1_0 = Vorder1_0[_n-1]     if Vorder1_0==. & Vorder1==1
drop temp

replace sortvarCol1=Vorder1_0 if Vorder1_0<`maxnum' 

gen double Vorder1_1 =Vorder1_0 if Vorder1==1 & v1~=""
replace Vorder1_1=Vorder1_1[_n-1]+.01 if Vorder1_1==. & Vorder1==1

* for groupvar( ) above
sort Vorder1 eq_order1 Vorder1_1 Vord1
replace Vord1=_n

drop varsml


*** merging the two files
* two sorting/merging mechanism
local N=_N
count if eqName1=="" & eqName1=="EQUATION"
local rN=`r(N)'
if `N'==`rN' & `usingSingle'==1 {
	* single equation in both files
	gen str8 mergeVar=""
	replace mergeVar = mergeOn
	sort mergeVar varnum
	
	merge mergeVar varnum using "`mergeVarFile'"
	drop mergeEq mergeVar
}
else if `N'~=`rN' & `usingSingle'==1 {
	* this one's multiple merged to earlier single
	
	gen str8 mergeVar=""
	replace mergeVar = mergeOn
	replace mergeVar = VarName1 if VarName1~="" & Vorder1==1
	replace mergeVar = "Constant" if VarName1=="_cons" &  Vorder1==1
	replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder1==1
	sort mergeVar varnum
	
	merge mergeVar varnum using "`mergeVarFile'"
	drop mergeEq mergeVar
}
else if `N'==`rN' & `usingSingle'==0 {
	* this one's multiple merged to earlier single
	gen str8 mergeVar=""
	replace mergeVar = mergeOn
	replace mergeVar = VarName1 if VarName1~="" & Vorder1==1
	replace mergeVar = "Constant" if VarName1=="_cons" &  Vorder1==1
	replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder1==1
	sort mergeVar varnum
	
	merge mergeVar varnum using "`mergeVarFile'"
	drop mergeEq mergeVar
}
else {
	* both files are multiple equations
	ren mergeOn mergeEq
	sort mergeEq varnum
	
	merge mergeEq varnum using "`mergeEqFile'"
	drop mergeEq mergeVar
}



*** clean up and sort the merged files
* Vorder2 has the information for the top 0.01-0.03
* but Vorder1 has the bottom notes
gen Vorder=Vorder2
replace Vorder=Vorder1 if Vorder==. | (Vorder1>3.5 & Vorder1<4)

gen byte merge2 = _merge==2

* Notes and defintions:
* Vorder2    _n for master file
* Vorder1    _n for using file

* Vorder2_0  identifier for each coefficient (using _n for the top most stats)
* Vorder2_1  added 0.01 consequtively to bysort Vorder2_0

* Vorder1_0  identifier for each coefficient (using _n for the top most stats)
* Vorder1_1  added 0.01 consequtively to bysort Vorder1_0

*** this fills up the potential gaps in Vord1 and Vord2 if the number of stats( ) per coefficient is different
*order eq_order* Vorder Vord1 Vord2 Vord* 

sort eq_order2 Vorder2_1
replace Vord1=Vord1[_n-1]+.01 if (Vorder2_0==Vorder2_0[_n-1] & Vorder2_0~=.) & (Vord1==. & Vord1[_n-1]~=.) & Vorder==1

sort eq_order1 Vorder1_1
replace Vord2=Vord2[_n-1]+.01 if (Vorder1_0==Vorder1_0[_n-1] & Vorder1_0~=.) & (Vord2==. & Vord2[_n-1]~=.) & Vorder==1

* it's off by 1; replace them all
replace Vorder2_1=Vord2 if Vorder==1
replace Vorder1_1=Vord1 if Vorder==1


*** new sorting rules
*** June 2008 Version
gen str8 eqName0=""
replace eqName0=eqName2
replace eqName0=eqName1 if eqName0=="" & eqName1~=""

sort eqName0 Vorder1_1
gen eq_order0=.
gen eq_temp=1 if eqName0[_n]~=eqName0[_n-1] & Vorder1_1~=.

************ sort to the existing column?
sort eq_temp Vorder1_1

*** get all constant rows
local count 0
gen constant=0
replace constant=1 if (v1=="Constant" | v1=="_cons" | report=="Constant" | report=="_cons" | VarName1=="Constant" | VarName2=="Constant" | VarName1=="_cons" | VarName2=="_cons") & Vorder==1
replace constant=1 if mergeOn==mergeOn[_n-1]+"!" & constant[_n-1]==1 & Vorder==1


************* needs beter levelsof code?
if "`exists_eq'"=="1" | ("`sideway'"=="sideway" & "`onecol'"=="onecol") {
	count if eq_temp==1
	if r(N)~=0 {
		forval num=1/`=r(N)' {
			local temp=eqName0[`num']
			
			* collecting names
			*local eqOrderList "`temp' `eqOrderList'"
			replace eq_order0=`num' if eqName0=="`temp'"
		}
		replace eq_order0=eq_order0+.5 if constant==1
	}
}
else {
	* pushes _cons toward the bottom
	replace eq_order0=1
	replace eq_order0=eq_order0+.5 if constant==1
}


count if Vorder2_0>=1 & Vorder2_0<.
local countV2=r(N)

count if Vorder1_0>=1 & Vorder1_0<.
local countV1=r(N)

*** sort( ) takes "name later"
* sort according to varname for _tab3
if "`sortcol'"=="name" {
	* do this by replacing these:
	sort mergeOn
	replace Vorder2_1=_n if Vorder==1
	replace Vorder1_1=_n if Vorder==1
}

* consolidate sortvarCol info
gen sortvarCol=sortvarCol1
replace sortvarCol=sortvarCol2 if sortvarCol==.


* temporary fix for Partha Deb: Aug 2008 version
if `countV2'>`countV1' | "`sortcol'"=="later" {
	*sort Vorder eq_order0 Vorder2_1 Vorder1_1 merge2 Vord2
	* Jan 2009 Mohl
	*sort Vorder eq_order0 Vorder2_1 Vorder1_1 merge2 Vord2 Vord1
	sort Vorder eq_order0 sortvarCol Vorder2_1 Vorder1_1 merge2 Vord2 Vord1
*order Vorder eq_order0 sortvarCol Vorder2_1 Vorder1_1 merge2 Vord2 Vord1
*browse
}
else {
	*sort Vorder eq_order0 Vorder1_1 Vorder2_1 merge2 Vord1
	* Jan 2009 Mohl
	*sort Vorder eq_order0 Vorder1_1 Vorder2_1 merge2 Vord1 Vord2
	sort Vorder eq_order0 sortvarCol Vorder1_1 Vorder2_1 merge2 Vord1 Vord2
*order Vorder eq_order0 sortvarCol Vorder1_1 Vorder2_1 merge2 Vord1 Vord2
*browse
}



*** fill in if it was a single equation combining with a multiple equation
count if eqName0~="EQUATION" & eqName0~=""
if `r(N)'>0 {
	replace report = "SINGLE:"+report if Vorder==1 & eqName0=="" & report~=""
	replace v1 = "SINGLE:"+v1 if Vorder==1 & eqName0=="" & v1~=""
}



replace v1 = report if v1=="" & report!=""
*drop report mergeOn varsml Vorder Vord1 Vord2 merge2 _merge v2plus
drop report mergeOn varnum        Vorder Vord1 Vord2 merge2 _merge v2plus Vorder1* Vorder2* eq* *Name*
cap drop sort*
cap drop group*

	* add the head column numbers
	if (`numcol'==2) {
		replace v2 = "(1)" if _n==`frstrow'
		replace reportCol = "(2)" if _n==`frstrow'
	}
	else {
		replace reportCol = "(" + string(`numcol') + ")" if _n==`frstrow'
	}



*** restore COEFFICIENT and 0 head
replace v1=`"`VARIABLES2'"' if rowtype1[_n+1]==0
replace v1=`"`VARIABLES2'"' if rowtype1==0 & v1[_n-1]~=`"`VARIABLES2'"'

drop rowtype1 rowtype2 constant

c_local VARIABLES `"`VARIABLES2'"'

end /* appendFile */


********************************************************************************************


prog define marginal2
	versionSet
	version `version'

* put marginal effects (dfdx) into b and vc matrices 

syntax , b(string) vc(string) [se margucp(string)]

tempname dfdx se_dfdx new_vc dfdx_b2		
capture mat `dfdx' = e(dfdx`margucp')
if _rc==0 {
	local cnam_b : colnames `dfdx'
	local cnam_1 : word 1 of `cnam_b'
}
if _rc!=0 {
	if "`cnam_1'"=="c1" {
		di in yellow `"Update dprobit ado file: type "help update" in Stata"'
	}
		else {
		di in yellow "{opt margin} option invalid: no marginal effects matrix e(dfdx`margucp') exists"
	}
	exit
}

/* create matrix of diagonals for vc */
if "`se'"=="se" {
	if e(cmd)=="dprobit" | e(cmd)=="tobit" {
		if e(cmd)=="dprobit" {
			local margucp "_dfdx"
		}
		mat `se_dfdx' = e(se`margucp')
		mat `vc' = diag(`se_dfdx')
		mat `vc' = `vc' * `vc'
	}
	else {
		mat `vc' = e(V_dfdx)
	}
	mat colnames `vc' = `cnam_b'
}
else {
	/* if t or p stats reported then trick `cv' into giving the right t stat */
	local coldfdx = colsof(`dfdx')
	mat `new_vc' = J(`coldfdx',`coldfdx',0)
	local i = 1
	while `i' <= `coldfdx' {
		scalar `dfdx_b2' = (el(`dfdx',1,`i')/el(`b',1,`i'))^2
		mat `new_vc'[`i',`i'] = `dfdx_b2'*`vc'[`i',`i']
		local i = `i'+1
	}
	mat colnames `new_vc' = `cnam_b'
	mat `vc' = `new_vc'
}  
mat `b' = `dfdx'
end


********************************************************************************************


prog define partxtl2, rclass
	versionSet
	version `version'


*** parse text list to find number of text elements and return them
	local ntxt = 0
	gettoken part rest: 1, parse(" (") 
	gettoken part rest: rest, parse(" (")		/* strip off "option(" */
	while `"`rest'"' != "" {
		local ntxt = `ntxt'+1
		gettoken part rest: rest, parse(",)") 
		return local txt`ntxt' `"`part'"'
		gettoken part rest: rest, parse(",)")	/* strip off "," or "(" */
	}
	return local numtxt `ntxt'
end


********************************************************************************************


*** this one avoids stripping the wrong parenthesis
prog define partxtl3, rclass
	versionSet
	version `version'


*** parse text list to find number of text elements and return them
	local ntxt = 0

	* CANNOT use these functions because of string length limitation
	*local begin = index(`"`1'"',`"("')
	*local length : length local 1
	*local rest=substr(`"`1'"',`begin'+1,`length'-`begin'-1)

	local rest `"`1'"'
	
	gettoken part rest: 1, parse(" (") 
	gettoken part rest: rest, parse(" (")		/* strip off "option(" */
	while `"`rest'"' != "" {
		local ntxt = `ntxt'+1
		gettoken part rest: rest, parse(",") 
		return local txt`ntxt' `"`part'"'
		local last_part `"`part'"'
		gettoken part rest: rest, parse(",")
	}
	
	* fix the last one by stripping the ending parenthesis
	gettoken part last_part: last_part, parse(")")
	
	* takes off too much
	if "`last_part'"=="))" {
		local part `"`part')"'
	}
	return local txt`ntxt' `"`part'"'
	
	return local numtxt `ntxt'
end


********************************************************************************************


prog define makeFile
* previously coeftxt2
	versionSet
	version `version'

if `a_version'>=11 {
	local fv fv
}

* getting the coefficient name, values, and t-statistics

syntax [varlist(default=none ts `fv')] , variables(string)			/*
*/ [equationsOption(string)							/*
*/ keep(string) drop(string) inddrop(str)					/*
*/ eqkeep(string) eqdrop(string)						/*
*/ eqlist(string) betaAsked							/*
*/ statsMany(integer 2) statsList(str asis) se_skip			/*
*/ BEta Level(integer $S_level) 						/*
*/ DEC(numlist) FMT(string) 							/*
*/ BDec(numlist) BFmt(string) 						/*
*/ SDec(numlist) SFmt(string) 						/*
*/ Tdec(numlist) TFmt(string)							/*
*/ PDec(numlist) PFmt(string) 						/*
*/ CDec(numlist) CFmt(string) 						/*
*/ ADec(numlist) AFmt(string)							/*
*/ RDec(numlist) RFmt(string)							/*
*/ AUTO(integer 3) LESS(integer 0) NOAUTO	DECMark(str asis)		/*
*/ noPAren parenthesis(str asis) BRacket BRacketA(passthru) 	/*
*/ noASter SYMbol(passthru) noCONs EForm noobs noNI 			/*
*/ noR2 ADJr2 ctitleList(string)							*]

local varlistTemp `"`varlist'"'

* cascading options:
local 0 `", `options'"'
syntax [, ADDStat(passthru) ADDText(passthru) noNOTes			/*
*/ ADDNote(passthru) APpend regN(string) df_r(string) rsq(string) /*
*/ numi(string) ivar(string) depvar(string) robust(string) 		/*
*/ BOROWS(string) b(string) vc(string) 					/*
*/ univar(string) Onecol estname(string) 					/*
*/ estnameUnique(string) fileExist(integer 1) 				/*
*/ ALPHA(string) asterisk(passthru) 2aster				/*
*/ matList(string) leave(string) sidewayWave(integer 1) eqsingle	/*
*/ stnum(str asis) ststr(str asis) ]

* options taken out: SE Pvalue CI Tstat

local varlist `"`varlistTemp'"'
local VARIABLES "`variables'"

tempvar b_coefficient b_st_err
tempname b_alone vc_alon b_xtra vc_xtra

* avoid re-transposing them later by giving distinct names
tempname b_transpose vc_diag_transpose

mat `b_transpose' = `b''
mat `vc_diag_transpose' = vecdiag(`vc')
mat `vc_diag_transpose' = `vc_diag_transpose''

local brows = rowsof(`b_transpose')

*** xt options
if (`numi'!=. & "`ni'"!="noni") {
	if `"`iname'"'=="" {
		local iname "`ivar'"
	}
	if `"`iname'"'=="." {
		local iname "groups"
	}
}


* populate with values from e(b) and e(V)
tempvar firstCol secondCol varKeepDrop report

*** fill in variables names column
gen str5 `report' = ""
gen str5 `firstCol' = ""
gen str5 `secondCol' = ""

local Names : rowfullnames(`b_transpose')
local Rows = rowsof(`b_transpose')

* extender making sure the obs > columns & obs > `Rows'
local N=_N
if `Rows'>`N'+1 & `Rows'<. {
	set obs `=`Rows'+1'
}
if `N'<1 {
	set obs 1
}

forval num=1/`Rows' {
	local temp : word `num' of `Names'
	
	tokenize "`temp'", parse(":")
	
	if "`2'"==":" {
		replace `firstCol' = "`1'" in `num'
		replace `secondCol' = "`3'" in `num'
	}
	else {
		replace `secondCol' = "`temp'" in `num'
		replace `report' = "`temp'" in `num'
	}
}
replace `report' = "Constant" if `firstCol'=="" & `secondCol'=="_cons"
replace `report' = `firstCol' + ":" + `secondCol' if `firstCol'~=""
replace `report' = `firstCol' + ":Constant" if `firstCol'~="" & `secondCol'=="_cons"

gen double `b_coefficient' = matrix(`b_transpose'[_n, 1]) in 1/`brows'
gen double `b_st_err' = matrix(`vc_diag_transpose'[_n, 1]) in 1/`brows'
replace `b_st_err' = sqrt(`b_st_err')

*** beta coefficient here
if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" | "`leave'"~="" {
	tempname betcoef
	
	sum `depvar' if e(sample)
	local betaSD `r(sd)'
	gen `betcoef' =.
	
	forval num=1/`Rows' {
		local temp=`secondCol'[`num']
		cap sum `temp' if e(sample)
		replace `betcoef' = r(sd)/`betaSD' * `b_coefficient' if `num'==_n & `secondCol'~="_cons"
	}
	
	replace `betcoef' = . if `secondCol'=="_cons"
	
	if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
		* set nocons
		*local cons "nocons"
	}
}



*** marksample, version 11 decouples of e(b) from e(sample)
if "`varlist'"=="" & "`casewise'"=="casewise" {
	noi di in red "{it:varlist} needs to be specified for use with {opt case:wise}"
	exit 198
}

tempvar touse
mark `touse' `if' `in' [`weight'`exp']

/*
count if e(sample)
if `r(N)'==0 {
	if "`raw'"=="raw" {
		mark `touse' `if' `in' [`weight'`exp']
	}
	else {
		noi di in red "zero e(sample) count; run a regression or specify {opt raw} or {opt case:wise}"
		exit 198
	}
}
else {
	cap confirm matrix e(b)
	if _rc==0 {
		* always esample restricted
		if `"`if'"'~="" {
			mark `touse' `if' & e(sample) `in' [`weight'`exp']
		}
		else {
			mark `touse' if e(sample) `in' [`weight'`exp']
		}
	}
	else if "`raw'"=="raw" | "`casewise'"=="casewise" {
		mark `touse' `if' `in' [`weight'`exp']
	}
	else {
		noi di in red "e(b) missing; post e-return matrices, run a regression, or specify {opt raw} or {opt case:wise}"
		exit 198
	}
}
*/

******************** may not always be e(b), may be margins


******************* all of these may not work well with -long- and multiple equations; problems with reg3 depvar names
count if `secondCol'~=""
local varMany=`r(N)'

if `varMany'>0 & `varMany'<. {
	
	local depvarTot 0
	cap local depvarTot: word count `depvar'
	if `depvarTot'==. | `depvarTot'==0 {
		local depvarTot 1
	}
	
	* needs to be lowered
	*local temp=lower(`"`statsList'"')
	local temp
	foreach var in `statsList' {
		local lowered=lower(`"`var'"')
		local temp `"`temp' `lowered'"'
	}
	
	_stats_check, `temp'
	
	*** summary from stats( ) here
	if "`sumAsked'"~="" {
		local tempL0
		
		if "`sumAsked'"=="regular" {
			* summary
			local sumList "N sum_w mean Var sd min max sum"
			local detail
		}
		
		if "`sumAsked'"=="detail" { 
			* detail
			local sumList "N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99"
			local detail detail
		}
		
		if "`sumAsked'"=="extra" {
			* detail & extra
			local extraList "cv range iqr semean median count"
			local sumList "N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 `extraList'"
			local detail detail
		}
		
		tempvar `sumList'
		foreach stuff in `sumList' {
			gen ``stuff'' = .
		}
		
		forval num=1/`varMany' {
			local content=`secondCol'[`num']
			cap sum `content' if `touse' [`weight'`exp'], `detail'
			if _rc==0 & `r(N)'>0 & `r(N)'<. {
				foreach stuff in `sumList' {
					if "`stuff'"~="cv" & "`stuff'"~="range" & "`stuff'"~="iqr" & "`stuff'"~="semean" & "`stuff'"~="median" & "`stuff'"~="count" {
						cap replace ``stuff'' = `r(`stuff')' in `num'
						local tempL0 "`tempL0' ``stuff''"
					}
					else {
						* extra
						foreach tt in `extraList' {
							local `tt'0
						}
						cap local cv0 `=`r(sd)'/`r(mean)''
						cap local range0 `=`r(max)'-`r(min)''
						cap local iqr0 `=`r(p75)'-`r(p25)''
						cap local semean0 `=`r(sd)'/(`r(N)'^.5)'
						cap local median0 `r(p50)'
						cap local count0 `r(N)'
						cap replace ``stuff'' = ``stuff'0' in `num'
						local tempL0 "`tempL0' ``stuff''"
					}
				}
			}
		}
	}
	
	


local tempL1
	
*** stats( ) correlations
forval wave=1/`depvarTot' {
	local depvarUse: word `wave' of `depvar'
	foreach cmd in corr pwcorr spearman {
		if "``cmd'Asked'"=="`cmd'" {
			tempvar `cmd'
			gen ``cmd'' = .
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
*********************** if no depvar, then use the varlist
				cap `cmd' `depvarUse' `content' if `touse' [`weight'`exp']
				if _rc==0 {
					cap replace ``cmd'' = `r(rho)' in `num'
				}
			}
			local tempL1 "`tempL1' ``cmd''"
		}
	}
}



*** independent commands at the bottom 1
forval wave=1/`depvarTot' {
	local depvarUse: word `wave' of `depvar'
	foreach cmd in covar pcorr semipcorr pcorrpval tau_a tau_b {
		if "``cmd'Asked'"=="`cmd'" {
			tempvar `cmd'
			gen ``cmd'' = .
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
*********************** if no depvar, then use the varlist
				cap `cmd' `depvarUse' `content' if `touse' [`weight'`exp']
				if _rc==0 {
					cap replace ``cmd'' = `r(`cmd')' in `num'
				}
			}
			local tempL1 "`tempL1' ``cmd''"
		}
	}
}



*** independent commands at the bottom 2
forval wave=1/`depvarTot' {
	local depvarUse: word `wave' of `depvar'
	foreach cmd in label label_pr label_up label_low {
		if "``cmd'Asked'"=="`cmd'" {
			tempvar `cmd'
			gen str7 ``cmd'' = ""
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
*********************** if no depvar, then use the varlist
				cap `cmd' `depvarUse' `content' if `touse' [`weight'`exp']
				if _rc==0 {
					replace ``cmd'' = `"`r(`cmd')'"' in `num'
				}
				else {
					******** not proper/upper/lower applied
					if "`content'"=="_cons" {
						replace ``cmd'' = `"Constant"' in `num'
					}
				}
			}
			local tempL1 "`tempL1' ``cmd''"
		}
	}
}


	*** stats( ) cmd( )
	* take out cmd( ) from statsList and replace with cmd1 cmd2 ...
	* also run the cmd( ) and get r( ) back out
	
	* `regVal1' `regVal2' ... tempvar name for the column containing the values
	* cmd1 cmd2 ... name that appears in statsList and the column variable names
	* cmd1 cmd2 ... also contain what each cmd are
	
	local tempL2
	local cmdList 
	
	local tempList
	local num 0
	local cc 0
	
	local one
	local two `statsList'
	
	while `"`two'"'~="" & `"`two'"'~=" " {
		local num=`num'+1
		
		gettoken one two: two, `bind'
		
		* if okay to add:
		local check=substr(trim("`one'"),1,4)
		if `"`check'"'=="cmd(" {
			
			* it's a cmd( )
			local cc=`cc'+1
			local cmd`cc'=`"`one'"'
			
			tempvar regVal`cc'
			gen str7 `regVal`cc'' = ""
			
			* separate reporting from cmd requested inside: cmd( r( ) cmd)
			gettoken reporting cmd: one, `bind' parse("(")
			gettoken reporting cmd: cmd, `bind' parse("(")
			gettoken reporting cmd: cmd, `bind' parse(":")
			gettoken colon cmd: cmd, `bind' parse(":")
			
			local cmd=substr("`cmd'",1,length("`cmd'")-1)
			gettoken cmd suboption: cmd , parse(",")
			
			local reg`cc'=`"`cmd'"'
			
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
				
	************************* disable varlist
	********************** if no depvar, then use the varlist
				
				cap `cmd' `depvar' `content' if `touse' [`weight'`exp'] `suboption'
				if _rc==0 {
					cap replace `regVal`cc'' = `"``reporting''"' in `num'
				}
			}
			local cmdList "`cmdList' cmd`cc'"
			local tempL2 "`tempL2' `regVal`cc''"
			local tempList "`tempList' cmd`cc'"
		}
		else {
			local tempList "`tempList' `one'"
		}
	}
	local statsList `"`tempList'"'
	
	
	
	*** stats( ) str( )
	* take out str( ) from statsList and replace with str1 str2 ...
	
	* `strVal1' `strVal2' ... tempvar name for the column containing the values
	*  string1 string2 ... name that appears in statsList and the column variable names
	*  string1 string2 ... also contain what each strings are
	
	local tempL3
	local strList 
	
	local tempList
	local num 0
	local cc 0
	
	local one
	local two `statsList'
	
	while `"`two'"'~="" & `"`two'"'~=" " {
		local num=`num'+1
		
		gettoken one two: two, `bind'
		
		* if okay to add:
		local check=substr(trim("`one'"),1,4)
		if `"`check'"'=="str(" {
			
			* it's a str( )
			local cc=`cc'+1
			local string`cc'=`"`one'"'
			
			tempvar strVal`cc'
			gen str7 `strVal`cc'' = ""
			
			* separate reporting from str requested inside: str( r( ) str)
			gettoken junk str: one, `bind' parse("(")
			gettoken junk str: str, `bind' parse("(")
			local str=substr("`str'",1,length("`str'")-1)
			
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
				replace `strVal`cc'' = `"`str'"' in `num'
			}
			local strList "`strList' string`cc'"
			local tempL3 "`tempL3' `strVal`cc''"
			local tempList "`tempList' string`cc'"
		}
		else {
			local tempList "`tempList' `one'"
		}
	}
	local statsList `"`tempList'"'
	
	
	
	/*
	*** stats( ) e( )
	* take out e( ) from statsList and replace with e1 e2 ...
	
	* `strVal1' `strVal2' ... tempvar name for the column containing the values
	*  string1 string2 ... name that appears in statsList and the column variable names
	*  string1 string2 ... also contain what each strings are
	
	local tempL4
	local eList 
	
	local tempList
	local num 0
	local cc 0
	
	local one
	local two `statsList'
	
	while `"`two'"'~="" & `"`two'"'~=" " {
		local num=`num'+1
		
		gettoken one two: two, `bind'
		
		* if okay to add:
		local check=substr(trim("`one'"),1,4)
		if `"`check'"'=="e(" {
			
			* it's a e( )
			local cc=`cc'+1
			local string`cc'=`"`one'"'
			
			tempvar eVal`cc'
			gen str7 `eVal`cc'' = ""
			
			* separate reporting from e requested inside: e( r( ) e)
			gettoken junk str: one, `bind' parse("(")
			gettoken junk str: str, `bind' parse("(")
			local str=substr("`str'",1,length("`str'")-1)
			
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
				replace `strVal`cc'' = `"`str'"' in `num'
			}
			local strList "`strList' string`cc'"
			local tempL3 "`tempL3' `strVal`cc''"
			local tempList "`tempList' string`cc'"
		}
		else {
			local tempList "`tempList' `one'"
		}
	}
	local statsList `"`tempList'"'
	*/




}

************************************* `r(varlist)' source
*** pre-clean (again)
if "`varlist'"~="" {
	if `a_version'>=11 {
		*fvunab varlist : `varlist'
		*fvexpand `varlist'
		*local varlist `r(varlist)'
	}
	else {
		tsunab varlist : `varlist'
	}
	macroUnique `varlist', names(varlist)
}

keep `report' `b_coefficient' `b_st_err' `betcoef' `firstCol' `secondCol' `tempL0' `tempL1' `tempL2' `tempL3'






*** get rid of original data since labels already accessed
*** rename them because the original data now gone

ren `b_coefficient' coef
ren `b_st_err' se
ren `report' report



if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" | "`leave'"~="" {
	ren `betcoef' beta
}

ren `firstCol' eqname
ren `secondCol' varname
keep if varname~=""



***************************** arbitary fix for o. missing zeros
drop if coef==0 & se==0 & (index(varname,"o.")==1 | index(varname,"0b.")==1 | /*
	*/ index(varname,"1b.")==1 | index(varname,"2b.")==1 | index(varname,"3b.")==1 | /*
	*/ index(varname,"4b.")==1 | index(varname,"5b.")==1 | index(varname,"6b.")==1)


***************************** fix for xtpoisson:
if "`eqsingle'"=="eqsingle" {
	replace report=varname
	replace eqname=""
}




if `varMany'>0 & `varMany'<. {
	if "`sumAsked'"~="" {
		foreach var in `sumList' {
			ren ``var'' `var'
		}
	}
	foreach var in label label_pr label_up label_low {
		if "``var'Asked'"~="" {
			ren ``var'' `var'
		}
	}
	foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b {
		if "``var'Asked'"~="" {
			ren ``var'' `var'
		}
	}
	local cc 1
	foreach var in `cmdList' {
		ren `regVal`cc'' cmd`cc'
		local cc=`cc'+1
	}
	local cc 1
	foreach var in `strList' {
		ren `strVal`cc'' string`cc'
		local cc=`cc'+1
	}
}

local inddropList `inddrop'

*** starting to keep/drop here

* inddrop before keep or drop
************************** needs to be unambiguated
if "`inddrop'"~="" {
	if "`indno'"=="" {
		local indno "No"
	}
	if "`indyes'"=="" {
		local indyes "Yes"
	}
	if "`indall'"=="indall" {
		* all most be present
	}
	else {
		* any must be present
		
		* first phrase
		local two `inddropList'
		while `"`two'"'~="" & `"`two'"'~=" " {
			gettoken one two: two, `bind' parse(",")
			local one=trim(`"`one'"')
			local two=trim(`"`two'"')
			
			local N0=_N
			foreach var in `one' {
				drop if varname=="`one'" & "varname"~=""
			}
			local N=_N
			if `N0'>`N' {
				* indicate Yes
				if `"`addstat'"'!="" {
					noi di in red `"111`addstat'"'
				}
				else {
					local addstat `"addstat(`"`one' included"', `indyes')"'
				}
			}
			else {
				* indicate No
				if `"`addstat'"'!="" {
					noi di in red `"222`addstat'"'
				}
				else {
					local addstat `"addstat(`"`one' included"', `indno')"'
				}
			}
		}
	}
}



/*
prog drop _all
sysuse auto, clear
reg weight rep78
outreg2 using myfile, replace adds(dd, 33)
*/



* varlist/keep
if "`keep'"~="" {
	local varlist "`keep'"
}

* varlist
if "`varlist'"~="" {
	gen str5 `varKeepDrop'=""
	
	* add the constant unless "nocons" is chosen
	if "`cons'"~="nocons" {
		local varlist "`varlist' _cons"
	}
	
	local count: word count `varlist'
	forval num=1/`count' {
		local temp : word `num' of `varlist'
		replace `varKeepDrop'="`temp'" if "`temp'"==varname
	}
	
	count if `varKeepDrop'=="" & varname~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	drop if `varKeepDrop'=="" & varname~=""
	drop `varKeepDrop'
}

* drop
if "`drop'"~="" {
	gen str5 `varKeepDrop'=""
	
	local count: word count `drop'
	forval num=1/`count' {
		local temp : word `num' of `drop'
		replace `varKeepDrop'="`temp'" if "`temp'"==varname
	}
	
	count if `varKeepDrop'~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	drop if `varKeepDrop'~=""
	drop `varKeepDrop'
}


*noi di in red "`brows'"
*noi di in red "`borows'"

if "`cons'"=="nocons" {
	gen count=1 if varname=="_cons"
	count if count==1
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	drop if count==1
	drop count
}


*noi di in red "`brows'"
*noi di in red "`borows'"

* drop some of multiple equations: 2 of 2
* (in case only one equation kept but `b' was passed thru inputed instead of `b_eq')

************* technically this should be fixed (get the eqname non-empty, and use indicator if multi-equation called for)
if "`eqdrop'"~="" & "`long'"=="long" {
	gen str5 `varKeepDrop'=""
	
	local count: word count `eqdrop'
	forval num=1/`count' {
		local temp : word `num' of `eqdrop'
		replace `varKeepDrop'="`temp'" if "`temp'"==eqname
	}
	
	count if `varKeepDrop'~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	drop if `varKeepDrop'~=""
	drop `varKeepDrop'
}



************* technically this should be fixed (get the eqname non-empty, and use indicator if multi-equation called for)
if "`eqkeep'"~="" & "`long'"=="long" {
	gen str5 `varKeepDrop'=""
	
	local count: word count `eqkeep'
	forval num=1/`count' {
		local temp : word `num' of `eqkeep'
		replace `varKeepDrop'="`temp'" if "`temp'"==eqname
	}
	
	count if `varKeepDrop'~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	keep if `varKeepDrop'~=""
	drop `varKeepDrop'
}

* reset brows after dropping
count if report~=""
local brows = `r(N)'


/*
matrix matrix1=level'

*** enhancing with outside matrix
*** fill in variables names column
tempname matrix1 first1 second1

*gen str5 `matrix1' = ""
*gen str5 `first1' = ""
*gen str5 `second1' = ""

*local Names : rowfullnames(`b_transpose')
*local Rows = rowsof(`b_transpose')

gen str5 matrix1 = ""
gen str5 first1 = ""
gen str5 second1 = ""
gen str5 varname1 = ""
local Names : rowfullnames(matrix1)
local Rows = rowsof(matrix1)

forval num=1/`Rows' {
	local temp : word `num' of `Names'
	
	tokenize "`temp'", parse(":")
	
	if "`2'"==":" {
		replace first1 = "`1'" in `num'
		replace second1 = "`3'" in `num'
	}
	else {
		replace second1 = "`temp'" in `num'
		replace varname1 = "`temp'" in `num'
	}
}
replace varname1 = "Constant" if first=="" & second=="_cons"
replace varname1 = first + ":" + second if first~=""
replace varname1 = first + ":Constant" if first~="" & second=="_cons"

gen double b = matrix(matrix1[_n, 1]) in 1/`brows'
gen double s = matrix(matrix1[_n, 1]) in 1/`brows'
replace s = sqrt(s)
*/



/*
*** rename variables for forced row matching
if `"`samevar'"'~="" {
	gettoken first second: samevar, parse(",")
}
*/


*** obtain the statistics of interest

* tstat
gen double tstat = (coef/se)


* T_alpha for the Ci
if `df_r'==. {
	gen double T_alpha = invnorm( 1-(1-`level' /100)/2 )
}
else {
	* replacement for invt( ) function under version 6
	* note the absolute sign: invttail is flipped from invnorm
	gen double T_alpha = abs(invttail(`df_r', (1-`level' /100)/2))
}

* ci
gen double ci_low=coef-T_alpha*se
gen double ci_high=coef+T_alpha*se
	
	* exponentiate beta and st_err
	gen double coefEform = exp(coef)
	gen double seEform = coefEform * se
	gen double ci_lowEform = exp(coef - seEform * T_alpha / coefEform)
	gen double ci_highEform = exp(coef + seEform * T_alpha / coefEform)

* pval
if `df_r'==. {
	gen double pval = 2*(1-normprob(abs(tstat)))
}
else {
	gen double pval = tprob(`df_r', abs(tstat))
}


* calculate asterisks for t-stats (or standard errors)
local titleWide=0
if "`append'"=="append" & `fileExist'==1 {
	local appottl = 1
}
else {
	local appottl = `titleWide'
}

* either an appended column (not the first regression) or has a title
* i.e. need an extra line above the coefficients
* added a second extra line above the coefficients: place 1 of 2
gen mrgrow = 2*_n + 1 + `appottl' + 1

*** dealing with the asterisks
if "`aster'"!="noaster" {
	
	if "`alpha'"~="" {
		* parse ALPHA
		partxtl2 `"`alpha'"'
		local alphaCount = r(numtxt)
		local num=1
		while `num'<=`alphaCount' {
			local alpha`num' `r(txt`num')'
			capture confirm number `alpha`num''
			if _rc!=0 {
				noi di in red `"`alpha`num'' found where number expected in {opt alpha()} option"'
				exit 7
			}
		local num = `num'+1
		}
	}
	else {
		if "`2aster'"=="2aster" {
			local alpha1=.01
			local alpha2=.05
			local alphaCount=2
		}
		else {
			local alpha1=.01
			local alpha2=.05
			local alpha3=.10
			local alphaCount=3
		}
	}
	
	if `"`symbol'"'!="" {
		* parse SYMBOL
		partxtl2 `"`symbol'"'
		local symbolCount = r(numtxt)
		local num=1
		while `num'<=`symbolCount' {
			local symbol`num' `r(txt`num')'
			capture confirm number `symbol`num''
			if _rc==0{
				noi di in red `"`symbol`num'' found where non-number expected in {opt sym:bol()}"'
				exit 7
			}
		local num = `num'+1
		}
	}
	else {
		*** assume 2aster when only two alpha was given
		if "`2aster'"=="2aster" | `alphaCount'==2 {
			* 1 and 5 %
			local symbol1 "**"
			local symbol2 "*"
			local symbolCount=2
		}
		else {
			* 1, 5, and 10%
			local symbol1 "***"
			local symbol2 "**"
			local symbol3 "*"
			local symbolCount=3
		}
		* when only SYMBOL was given
		if "`alpha'"=="" {
			
		}
	}
	
	if "`alpha'"~="" & `"`symbol'"'~="" {
		if `symbolCount'~=`alphaCount' {
			di in red "{opt alpha()} and {opt sym:bol()} must have the same number of elements"
			exit 198
		}
	}
	
	if "`alpha'"=="" & `"`symbol'"'~="" {
		if `symbolCount'>=4 {
			di in red "{opt alpha()} must be specified when more than 3 symbols are specified with {opt sym:bol()}"
			exit 198
		}
	}
	
	if "`alpha'"~="" & `"`symbol'"'=="" {
		local symbolCount=`alphaCount'
		if `alphaCount'>=4 {
			di in red "{opt sym:bol()} must be specified when more than 3 levels are specified with {opt alpha()}"
			exit 198
		}
	}
	
	* fix the leading zero
	local num=1
	while `num'<=`alphaCount' {
		if index(trim("`alpha`num''"),".")==1 {
			local alpha`num'="0`alpha`num''"
		}
		local num=`num'+1
	}
	
	* creating the notes for the alpha significance
	local astrtxt `"`symbol1' p<`alpha1'"'
	local num=2
	while `num'<=`symbolCount' {
		local astrtxt `"`astrtxt', `symbol`num'' p<`alpha`num''"'
		local num=`num'+1
	}
	
	* assign the SYMBOL
	gen str12 astrix = `"`symbol1'"' if (abs(pval)<`alpha1' & abs(pval)!=.)
	
	local num=2
	while `num'<=`symbolCount' {
		replace astrix = `"`symbol`num''"' if astrix=="" & (abs(pval)<`alpha`num'' & abs(pval)!=.)
		local num=`num'+1
	}
}
else {
	gen str2 astrix = ""
}



* add in matrix/vectors names if provided in stats( )
* the values are to be autodigit later
* splits matList into vectorList and nonvecList

local vectorList
local nonvecList

if "`matList'"~="" {
	tempname matdown
	foreach matname in `matList' {
		mat `matdown'=`matname'		/* NOT transposed */
		local temp= colsof(`matdown')
		
		* pre-save
		count if eqname~=""
		local masterEqExist=`r(N)'
		
		tempfile masterMultiFile masterSingleFile
		
		* original file is single equations
		sort varname
		save `masterSingleFile', replace
		
		* original file is multiple equations
		sort eqname varname
		save `masterMultiFile', replace
		
		* empties
		drop *
		
		cap gen str5 report = ""
		cap gen str5 eqname = ""
		cap gen str5 varname= ""
		
		if `temp'==1 {
			* it's a vector
			local vectorList "`vectorList' `matname'"
			
			*** borrowed from: *** fill in variables names column
			
			local Names : rowfullnames(`matdown')
			local Rows = rowsof(`matdown')
			set obs `Rows'
			
			forval num=1/`Rows' {
				local temp : word `num' of `Names'
				
				tokenize "`temp'", parse(":")
				
				if "`2'"==":" {
					replace eqname = "`1'" in `num'
					replace varname= "`3'" in `num'
				}
				else {
					replace varname= "`temp'" in `num'
					replace report = "`temp'" in `num'
				}
			}
			replace varname= "_cons" if varname=="Constant"
			
			replace report = "Constant" if eqname=="" & varname=="_cons"
			replace report = eqname + ":" + varname if eqname~=""
			replace report = eqname + ":Constant" if eqname~="" & varname=="_cons"
			
			svmat double `matdown', name(`matname')
			
			* take off 1's that's been slapped on
			cap ren `matname'1 `matname'
		}
		else {
			* it's a non-vector matrix
			local cc= colsof(`matdown')
			local temp0 : colnames(`matdown')
			local temp
			foreach var in `temp0' {
				local temp "`temp' `matname'_`var'"
			}
			local nonvecList "`nonvecList' `temp'"
			
			*** borrowed from: *** fill in variables names column
			
			local Names : rowfullnames(`matdown')
			local Rows = rowsof(`matdown')
			set obs `Rows'
			
			forval num=1/`Rows' {
				local temp : word `num' of `Names'
				
				tokenize "`temp'", parse(":")
				
				if "`2'"==":" {
					replace eqname = "`1'" in `num'
					replace varname= "`3'" in `num'
				}
				else {
					replace varname= "`temp'" in `num'
					replace report = "`temp'" in `num'
				}
			}
			replace varname= "_cons" if varname=="Constant"
			
			replace report = "Constant" if eqname=="" & varname=="_cons"
			replace report = eqname + ":" + varname if eqname~=""
			replace report = eqname + ":Constant" if eqname~="" & varname=="_cons"
			
			svmat double `matdown', name(col)
			
			* make it unique name
			foreach var in `temp0' {
				ren `var' `matname'_`var'
			}
			
			* take off 1's that's been slapped on
			*cap ren `matname'1 `matname'
		}
		
		count if eqname~=""
		local usingEqExist=`r(N)'
		
		* slap back to the original master files
		if `masterEqExist'==0 | `usingEqExist'==0 {
			* at least one single equation
			sort varname
			merge varname using "`masterSingleFile'"
		}
		else {
			* both are multiple equations
			sort eqname varname
			merge eqname varname using "`masterMultiFile'"
		}
		sort mrgrow
		cap drop _m
	}
	
	tempvar order constCol
	gen `order'=_n
	gen `constCol'=0
	replace `constCol'=1 if varname=="_cons"
	sort `constCol' `order'
	drop `constCol' `order'
	
	* slap on SINGLE if only some are missing equation names
	local N=_N
	count if eqname==""
	if `r(N)'~=`N' {
		replace report="SINGLE:"+varname if eqname==""
		replace eqname="SINGLE" if eqname==""
	}
	
	* update
	count if mrgrow==.
	local brows=`brows'+`r(N)'
	replace mrgrow = 2*_n + 1 + `appottl' + 1
	sort eqname varname
}

* leave matrices if user-provided suffix available
if "`leave'"~="" {
	count if varname~=""
	local rN=r(N)
	loca name
	forval num=1/`rN' {
		local temp=report[`num']
		local name "`name' `temp'"
	}
	
	foreach var in ci_highEform ci_lowEform seEform beta coefEform ci_high ci_low pval tstat se coef {
****************************** Val must come off due to renaming
		mkmat `var'Val in 1/`rN', matrix(`var'`leave')
		mat colnames `var'`leave'=`var'`leave'
		mat rownames `var'`leave'=`name'
	}
}


*** putting together
* list of current column names other than user specified matrix:
* coef se report (beta) tstat T_alpha ci_low ci_high pval mrgrow astrix

gen str12 reportCol = ""

* first prepare ancillary stats (tstat | se | ci | pvalue | beta)

foreach var in varname coef coefEform beta							/*
		*/ pval tstat se seEform 						/*
		*/ ci ciEform ci_low ci_lowEform ci_high ci_highEform		/*
		*/ aster blank 								{
	gen str12 `var'String = ""
}

if `varMany'>0 & `varMany'<. & "`sumAsked'"~="" {
	foreach var in `sumList' {
		gen str12 `var'String = ""
	}
}
foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b {
	if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" {
		gen str12 `var'String = ""
	}
}
foreach var in eqname         label label_pr label_up label_low {
	if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" {
		gen str12 `var'String = ""
	}
}

if `varMany'>0 & `varMany'<. {
	foreach var in `cmdList' {
		gen str12 `var'String = ""
	}
	foreach var in `strList' {
		gen str12 `var'String = ""
	}
}

*** string
replace varnameString=report

foreach var in eqname varname label label_pr label_up label_low {
	if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" {
		replace `var'String = `var'
	}
}

local N=_N
* autodigit matrix columns
if `"`vectorList'"'~="" {
	foreach var in `vectorList' {
		gen str12 `var'String = ""
	}
	
	* autoformat all user-defined matrices
	foreach name in `vectorList' {
		autogen `name', replace(`name'String)  auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
	}
}
if `"`nonvecList'"'~="" {
	foreach var in `nonvecList' {
		gen str12 `var'String = ""
	}
	
	* autoformat all user-defined matrices
	foreach name in `nonvecList' {
		autogen `name', replace(`name'String)  auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
	}
}

replace asterString = astrix if astrix~=""


/* not effective b/c drop/keep done above, yet tstat is not define up there
*** set nocons if Constant row is empty
tempvar test1 test2
gen `test1'=.
foreach var in `statsList' {
	* capture 'cause might not exist
	cap replace `test1'=1 if `var'~=.
}
gen `test2'=1 if `test1'==. & varname=="_cons"
qui sum `test2', meanonly
if `r(N)'>0 {
	local cons nocons
}
drop `test1' `test2'
*/


*** decimals and formats (old)

/*	* parse bfmt
	local fmttxt "e f g fc gc"
	partxtl2 `"`bfmt'"'
	local bfmtcnt = r(numtxt)
	local b = 1
	while `b'<=`bfmtcnt' {
		local bfmt`b' `r(txt`b')'
		if index("`fmttxt'","`bfmt`b''")==0 {
			di in red `"bfmt element "`bfmt`b''" is not a valid number format (f,fc,e,g or gc)"'
			exit 198
		}
	local b = `b'+1
	}
	
	*** fill in bdec(#) & bfmt(txt)
	local b = 1
	while `b'<=_N {
		local bdec`b' : word `b' of `bdec'
		if "`bdec`b''"=="" {
			local bdec`b' = `prvbdec'
		}
		local prvbdec "`bdec`b''"
		local b = `b'+1
	}
	* bfmt1 is already set above
	local b = `bfmtcnt'+1
	while `b'<=_N {
		local b_1 = `b'-1
		local bfmt`b' "`bfmt`b_1''"
		local b = `b'+1
	}
*/





*** could possibly be empty
local N=_N
if `N'==0 {
	set obs 1
}




*** stnum( ) transformations of stats( ) contents
if `"`stnum'"'~="" {
	gettoken one two: stnum, parse(,)
	while `"`one'"'~="" {
		if `"`one'"'~="," {
			`one'
		}
		gettoken one two: two, parse(,)
	}
}




*** decimals and formats

* originals
foreach thing in dec sdec bdec tdec pdec cdec rdec 			fmt sfmt bfmt tfmt pfmt cfmt rfmt {
	local `thing'0 ``thing''
}

* decimlas
if "`dec'"=="" {
	foreach stuff in dec sdec bdec tdec pdec cdec rdec {
		if "``stuff''"=="" {
			local `stuff' 3
		}
	}
}
else {
	foreach stuff in bdec sdec tdec pdec cdec rdec {
		if "``stuff''"=="" {
			local `stuff' `dec'
		}
	}
}

* formats
if "`fmt'"=="" {
	foreach stuff in fmt sfmt bfmt tfmt pfmt cfmt rfmt {
		if "``stuff''"=="" {
			local `stuff' fc
		}
	}
}
else {
	foreach stuff in bfmt sfmt tfmt pfmt cfmt rfmt {
		if "``stuff''"=="" {
			local `stuff' `fmt'
		}
	}
}


* disable autofmt if dec or bdec given
if "`dec0'"~="" | "`bdec0'"~="" {
	local noauto noauto
}



*** for the (parenthesis) numbers
	local N=_N
	if "`tdec0'"=="" & "`noauto'"~="noauto" {
		autogen tstat, replace(tstatString) auto(`auto') less(`less') fmt(`tfmt') width(12) decmark(`decmark')
		
		
		/* use autodigits
		forval num=1/`N' {
			autodigits2 tstat[`num'] `auto' `less'
			replace tstatString = string(tstat,"%12.`r(valstr)'") in `num'
			
			*autofmt, input(`=tstat[`num']') auto(`auto') less(`less')
			*replace tstatString = `"`r(output1)'"' in `num'
		}
		*/
	}
	else {
		fmtgen tstat, replace(tstatString) dec(`tdec') fmt(`tfmt') width(12) decmark(`decmark')
	}
	
	if "`sdec0'"=="" & "`noauto'"~="noauto" {
		autogen se, replace(seString) auto(`auto') less(`less') fmt(`sfmt') width(12) decmark(`decmark')
		autogen seEform, replace(seEformString) auto(`auto') less(`less') fmt(`sfmt') width(12) decmark(`decmark')
	}
	else {
		fmtgen se, replace(seString ) dec(`sdec') fmt(`sfmt') width(12) decmark(`decmark')
		fmtgen seEform, replace(seEformString ) dec(`sdec') fmt(`sfmt') width(12) decmark(`decmark')
	}
	
	if "`pdec0'"==""  & "`noauto'"~="noauto" {
		autogen pval, replace(pvalString) auto(`auto') less(`less') fmt(`pfmt') width(12) decmark(`decmark')
	}
	else {
		fmtgen pval, replace(pvalString ) dec(`pdec') fmt(`pfmt') width(12) decmark(`decmark')
	}
	
	if "`cdec0'"=="" & "`noauto'"~="noauto" {
		autogen ci_low, replace(ci_lowString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark')
		autogen ci_high, replace(ci_highString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark')
		replace ciString = ci_lowString + " - " + ci_highString
		
		autogen ci_lowEform, replace(ci_lowEformString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark')
		autogen ci_highEform, replace(ci_highEformString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark')
		replace ciEformString = ci_lowEformString + " - " + ci_highEformString
	}
	else {
		fmtgen ci_low, replace(ci_lowString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark')
		fmtgen ci_high, replace(ci_highString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark')
		replace ciString = ci_lowString + " - " + ci_highString
		
		fmtgen ci_lowEform, replace(ci_lowEformString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark')
		fmtgen ci_highEform, replace(ci_highEformString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark')
		replace ciEformString = ci_lowEformString + " - " + ci_highEformString
	}
	
	if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
		fmtgen beta, replace(betaString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark')
	}
	
	*** prepare coefSring
	if "`bdec0'"=="" & "`noauto'"~="noauto" {
		autogen coef, replace(coefString) auto(`auto') less(`less') fmt(`bfmt') width(12) decmark(`decmark')
		autogen coefEform, replace(coefEformString) auto(`auto') less(`less') fmt(`bfmt') width(12) decmark(`decmark')
		
		* beta here (with coef)
		if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
			autogen beta, replace(betaString) auto(`auto') less(`less') fmt(`bfmt') width(12) decmark(`decmark')

		}
	}
	else {

		fmtgen coef, replace(coefString) dec(`bdec') fmt(`bfmt') width(12) decmark(`decmark')
		fmtgen coefEform, replace(coefEformString) dec(`bdec') fmt(`bfmt') width(12) decmark(`decmark')
		
		* beta here (with coef)
		if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
			fmtgen beta, replace(betaString) dec(`bdec') fmt(`bfmt') width(12) decmark(`decmark')
		}
	}


local N=_N
if `varMany'>0 & `varMany'<. & "`sumAsked'"~="" {
	
	*** digits and formats for sumAsked:
	if "`dec0'"=="" & "`noauto'"~="noauto" {
		foreach var in `sumList' {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark')
		}
	}
}
foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b {
	if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" {
		
		*** digits and formats for stats( ) correlations:
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark')
		}
	}
}
if `varMany'>0 & `varMany'<. {
	foreach var in `cmdList' {
		*** digits and formats for stats( ) cmd( ):
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark')
		}
	}
	foreach var in `strList' {
		*** digits and formats for stats( ) str( ):
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark')
		}
	}
	foreach var in `sigList' {
		*** digits and formats for stats( ) sig( ):
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark')
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark')
		}
	}
}




*** ststr( ) transformations of stats( ) contents
if `"`ststr'"'~="" {
	* convert non-string into string of the same name if possible
	local strList
	foreach var of varlist *String {
		local temp=substr("`var'",1,length(trim("`var'"))-6)
		cap confirm string variable `temp, exact
		if _rc~=0 {
			* not a string
			tempvar `temp'numer
			cap gen ``temp'numer'=`temp'
			cap tostring `temp', replace force
			cap replace `temp'=`temp'String
			if _rc==0 {
				local tempvarList `"`tempvarList' `temp'numer"'
			}
		}
	}
	
	gettoken one two: ststr, parse(,)
	while `"`one'"'~="" {
		if `"`one'"'~="," {
			`one'
		}
		gettoken one two: two, parse(,)
	}
	
	* convert back to numeral format if available
	foreach var in `tempvarList' {
		local temp=substr("`var'",1,length(trim("`var'"))-5)
		cap replace `temp'String=`temp'
			* work around for varabbrev on
		cap confirm variable `temp', exact
		if _rc==0 {
			drop `temp'
		}
		cap gen `temp'=`temp'numer
	}
}


	
	*** moved here from the main body
	/* slap parenthesis for non-coef contents
	if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" & "`paren'"~="noparen" {
		* blank at end
		local statsList "`statsList' "
		local parenthesis : subinstr local statsList "coef " "", all
		local parenthesis : subinstr local parenthesis "coefEform " "", all
		
		* no parenthesis for blank row
		local parenthesis : subinstr local parenthesis "blank " "", all
	}
	*/
	
	* slap parenthesis for non-blank, even rows (as in parity)
	* do not work well with sideway
	* this might be violated by -sideway- but -cap replace- prevents error
	if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" & "`paren'"~="noparen" {
		gettoken one two: statsList
		local odd 1
		while `"`two'"'~="" {
			if `odd'==0 {
				local parenthesis	"`parenthesis' `one'"
				local odd 1
			}
			else {
				local odd 0
			}
			gettoken one two: two
		}
		if `odd'==0 {
			local parenthesis	"`parenthesis' `one'"
			local odd 1
		}
		else {
			local odd 0
		}
	}

************ ad hoc fix
* take out Eform and put it back in
local parenthesis `"`parenthesis' "'
local parenthesis : subinstr local parenthesis "Eform " " ", all
local parenthesis =trim("`parenthesis'")

if `"`paren'"'~="noparen" {
	if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" {
		local parenthesis "se"
	}
	
	if `"`parenthesis'"'~="" {
		* other possible valid: level coef_eform se_eform coef_beta se_beta
		* also added: seEform, etc
		optionSyntax, valid(eqname varname label label_pr label_up label_low coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var /*
			*/ sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count corr covar pwcorr spearman /*
			*/ pcorr semipcorr pcorrpval tau_a tau_b `cmdList' `strList' `matList') /*
			*/ name(parenthesis) nameShow(paren:thesis( )) content(`parenthesis') passthru noreturn
		local parenList `"`optionList'"'
		local parenPerCoef `optionCount'
	}
	
	* update when eform specified
	if "`eform'"=="eform" {
		local parenList "`parenList' "
		* may be redundant
		local parenList : subinstr local parenList "coef " "coefEform ", all
		local parenList : subinstr local parenList "ci " "ciEform ", all
		local parenList : subinstr local parenList "se " "seEform ", all
		
		local parenList : subinstr local parenList "ci_high " "ci_highEform ", all
		local parenList : subinstr local parenList "ci_low " "ci_lowEform ", all
	}
	
	if `"`bracketA'"'~="" {
		*** bracketA( ) option cleanup
		* other possible valid: level coef_eform se_eform coef_beta se_beta
		optionSyntax, valid(eqname varname label label_pr label_up label_low coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var /*
			*/ sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count covar corr pwcorr spearman /*
			*/ pcorr semipcorr pcorrpval tau_a tau_b `cmdList' `strList' `matList' ) /*
			*/ name(bracketA) nameShow(br:acket( )) content(`bracketA') passthru noreturn
		local bracketList `"`optionList'"'
		local bracketPerCoef `optionCount'
	}
	
	* update when eform specified
	if "`eform'"=="eform" {
		local bracketList "`bracketList' "
		* may be redundant
		local bracketList : subinstr local bracketList "coef " "coefEform ", all
		local bracketList : subinstr local bracketList "ci " "ciEform ", all
		local bracketList : subinstr local bracketList "se " "seEform ", all
	}
	
	if "`bracket'"=="bracket" & "`parenthesis'"=="" {
		replace tstatString = "[" + tstatString + "]" if tstatString ~=""
		replace pvalString = "[" + pvalString + "]" if pvalString  ~=""
		replace ciString = "[" + ciString + "]" if ciString ~=""
		replace ciEformString = "[" + ciEformString + "]" if ciEformString ~=""
		
		replace ci_lowString = "[" + ci_lowString + "]" if ci_lowString ~=""
		replace ci_highString = "[" + ci_highString + "]" if ci_highString ~=""
		replace ci_lowEformString = "[" + ci_lowEformString + "]" if ci_lowEformString ~=""
		replace ci_highEformString = "[" + ci_highEformString + "]" if ci_highEformString ~=""
		
		replace betaString= "[" + betaString+ "]" if betaString ~=""
		replace seString = "[" + seString + "]" if seString ~=""
		replace seEformString = "[" + seEformString + "]" if seEformString ~=""
		replace betaString= "[" + betaString+ "]" if betaString ~=""
	}
	else if "`bracket'"=="bracket" & "`parenthesis'"~="" {
		local num 1
		while `num'<=`parenPerCoef' {
			local temp : word `num' of `parenList'
			replace `temp'String = "[" + `temp'String + "]" if `temp'String ~=""
			local num=`num'+1
		}
	}	
	else {
		if "`parenthesis'"~="" {
			local num 1
			while `num'<=`parenPerCoef' {
				local temp : word `num' of `parenList'
				cap replace `temp'String = "(" + `temp'String + ")" if `temp'String ~=""
				local num=`num'+1
			}
		}
		if "`bracketA'"~="" {
			local num 1
			while `num'<=`bracketPerCoef' {
				local temp : word `num' of `bracketList'
				cap replace `temp'String = "[" + `temp'String + "]" if `temp'String ~=""
				local num=`num'+1
			}
		}
	}
} /* if `"`paren'"'~="noparen" */



* when no coefficient/cons are present (prevent subid from going undefined)
local N=_N
if `N'==0 {
	set obs 1
}

gen id=_n
expand `statsMany'
bys id: gen subid=_n

*replace report = " " if subid~=1 /* no variable names next to tstats */
replace report = "" if subid~=1 /* no variable names next to tstats */

	/* a little more complicated, not use optionSyntax
	if `"`asterisk'"'~="" {
		*** asterisk( ) option cleanup
		* other possible valid: level coef_eform se_eform coef_beta se_beta
		optionSyntax, valid(coef se tstat pval ci        blank beta ci_low ci_high) /*
			*/ name(asterisk) nameShow(aster:isk( )) content(`asterisk') passthru noreturn
		local asterList `"`optionList'"'
		local asterPerCoef `optionCount'
	}
	*/
	
	if `"`asterisk'"'~="" {
		
		*** asterisk( ) option cleanup
		local asterValid "coef se tstat pval ci        blank beta ci_low ci_high"
		* no aster here
		* level coef_eform se_eform coef_beta se_beta"
		
		* take comma out
		local asterisk : subinstr local asterisk "asterisk(" " ", all
		local asterisk : subinstr local asterisk ")" " ", all
		local asterisk : subinstr local asterisk "," " ", all
		
		local asterPerCoef : word count `asterisk'
		local num=1
		local asterList ""
		
		while `num'<=`asterPerCoef' {
			local aster`num' : word `num' of `asterisk'
			
			* it must be one of the list
			local test 0
			foreach var in `asterValid' {
				if "`var'"=="`aster`num''" & `test'==0 {
					local test 1
				}
			}
		* no longer test for asterValid
		*	if `test'==0 {
		*		noi di in red "{opt `aster`num''} is neither a valid option or matrix for {opt aster:isk( )}"
		*		exit 198
		*	}
			local asterList "`asterList' `aster`num''"
			local num=`num'+1
		}
	}
	
	* update when eform specified
	if "`eform'"=="eform" {
		local asterList "`asterList' "
		local asterList : subinstr local asterList "coef " "coefEform ", all
		local asterList : subinstr local asterList "ci " "ciEform ", all
		local asterList : subinstr local asterList "se " "seEform ", all
		
		local asterList : subinstr local asterList "ci_high " "ci_highEform ", all
		local asterList : subinstr local asterList "ci_low " "ci_lowEform ", all
	}
	
	*** combining them into one column
	
	if "`asterisk'" == "" {
		forval num=1/`statsMany' {
			local var : word `num' of `statsList'
			replace reportCol=`var'String if subid==`num'
			
			* attach asterString
			replace reportCol=`var'String + asterString if subid==`num' & ("`var'"=="coef" | "`var'"=="coefEform")
		}
	}
	else {
		forval num=1/`statsMany' {
			local var : word `num' of `statsList'
			replace reportCol=`var'String if subid==`num'
			
			* attach asterString
			forval nn=1/`asterPerCoef' {
				replace reportCol=`var'String + asterString if subid==`num' & ("`var'"=="`aster`nn''" | "`var'"=="`aster`nn''Eform")
			}
		}
	}

* drops vector/matrices as well:
keep report eqname varname mrgrow reportCol

local num=mrgrow[1]-2
replace mrgrow=`num'+_n

* first find number of new rows for addstat()
if `"`addstat'"'!="" {
	partxtl3 `"`addstat'"'
	local naddst = int((real(r(numtxt))+1)/2)
	
	local n = 1
	while `n'<=`naddst' {
		local t = (`n'-1)*2+1
		local astnam`n' `r(txt`t')'
		local t = `t'+1
		local astval`n' `r(txt`t')' /* pair: stat name & value */
		local n = `n'+1
	}
}
else {
	local naddst=0
}

* find number of new rows for addnote()
if (`"`addnote'"'!="" & "`append'"!="append") | (`"`addnote'"'!="" & `fileExist'==0) {
	partxtl2 `"`addnote'"'
	local naddnt = r(numtxt)
	local n = 1
	while `n'<=`naddnt' {
		local anote`n' `r(txt`n')'
		local n = `n'+1
	}
}
else {
	local naddnt=0
}

* calculate total number of rows in table
* added a second extra line above the coefficients: place 2 of 2
*local coefrow = 2*`brows'+1+`appottl' + 1
local coefrow = `statsMany'*`brows'+1+`appottl' + 1
*local totrows =     `coefrow' + ("`nobs'"!="nonobs") + (`numi'!=.) + ("`r2'"!="nor2"&`rsq'!=.&`df_r'!=.) + `naddst' + ("`notes'"!="nonotes"&"`append'"!="append")*(1+("`aster'"!="noaster")) + `naddnt'
local totrows  = 2 + 20 + `coefrow' + ("`nobs'"!="nonobs") + (`numi'!=.) + ("`r2'"!="nor2")                    + `naddst' + ("`notes'"!="nonotes"&"`append'"!="append")*(1+("`aster'"!="noaster")) + `naddnt' + ("`notes'"!="nonotes" & `fileExist'==0)*(1+("`aster'"!="noaster"))
*                2 added for the top and bottom row (empty), 20 added for the heck of it
* totrows calculation is apparently no longer accurate when no file exists; merely drop the extra row at the end

* cap here because could be lower due to drop/nocons
cap set obs `totrows'

* insert the top row (empty), rowtype2==0
local N=_N
set obs `=`N'+1'
local N=_N
replace mrgrow = 1 in `N'

gen rowtype2=0 in `N'

local N=_N

*** always add the head column numbers
if "`append'"=="append" & `fileExist'==1 {
	replace mrgrow = 0.001 in `=`N'-2'
	replace reportCol = "(1)" in `=`N'-2'
}
else {
	replace mrgrow = 0.001 in `=`N'-2'
	replace reportCol = "(1)" in `=`N'-2'
	* add one back to make up for it
	local coefrow = `coefrow'+1
}

local coefrow = `coefrow'-1

* there must be at least one ctitleList
if `"`ctitleList'"'=="" {
	local ctitleList " "
}



*** ad hoc fix for ctitleList, which is assigned by the main program from stats( ) contents
********* ctitleList needs to fixed for -sideway- and str( ) or cmd( ) invoked
if "`cmd1'"=="`ctitleList'" & "`statsMany'"=="1" {
	local ctitleList `"`reg1'"'
}
if "`string1'"=="`ctitleList'" & "`statsMany'"=="1" {
	local ctitleList "string"
}


* parsing ctitleList contents (2 of 2), counts the first and the last comma and the consecutive commas
local rest `"`ctitleList'"'
local count 0
while `"`rest'"'~="" {
	gettoken first rest: rest, parse(",")
	if `"`first'"'=="," & `count'==0 {
		local count=`count'+1
		local txt`count'
	}
	if `"`first'"'~="," {
		local count=`count'+1
		local txt`count' `"`first'"'
	}
	if `"`first'"'=="," & `"`previous'"'=="," {
		local count=`count'+1
		local txt`count'
	}
	local previous `"`first'"'
}
if `"`first'"'=="," & `count'~=0 {
	local count=`count'+1
	local txt`count'
}

local numtxt `count'

* adding more rows for ctitles
if `numtxt'>0 {
	set obs `=`N'+`numtxt''
	local N=_N
	forval num=1/`numtxt' {
		replace mrgrow = `num'/100 in `=`N'-`num'+1'
		
		* insert ctitles
		replace reportCol=`"`txt`num''"' in `=`N'-`num'+1'
		
		replace rowtype2=-1 in `=`N'-`num'+1'
		local coefrow = `coefrow'+1
	}
}

sort mrgrow
replace mrgrow = _n

* the bottom row (empty), rowtype2==2
local coefrow = `coefrow'+1

replace rowtype2=-1 if rowtype2[_n+1]==0 | rowtype2[_n+1]==-1

replace rowtype2=1 if _n<`coefrow' & rowtype2==.
replace rowtype2=2 if _n==`coefrow'
replace rowtype2=3 if _n>`coefrow'


* only if it's not sideway runons
if `sidewayWave'==1 {
	
	* number of observations
	if "`obs'"!="noobs" {
		local coefrow = `coefrow'+1
		replace report = "Observations" if _n==`coefrow'
		*replace reportCol = string(`regN') if _n==`coefrow'
		replace reportCol = string(`regN',"%12.0fc") if _n==`coefrow'
	}
	
	if (`numi'!=. & "`ni'"!="noni") {
		local coefrow = `coefrow'+1
		replace report = "Number of " + rtrim(`"`iname'"') if _n==`coefrow'
		*replace reportCol = string(`numi') if _n==`coefrow'
		replace reportCol = string(`numi',"%12.0fc") if _n==`coefrow'
	}
	
	* scalar crap, no rsq if it's a dot
	if "`r2'"~="nor2" {
		if `=`rsq''==. {
			local r2 "nor2"
		}
	}
	
	if "`r2'"!="nor2" {
		/* if df_r=., not true r2 */
		local coefrow = `coefrow'+1
		replace reportCol = string(`rsq',"%12.`rdec'`rfmt'") if _n==`coefrow'
		if `"`decmark'"'~="" {
			replace reportCol = subinstr(reportCol,".",`"`decmark'"',.) if _n==`coefrow'
		}
		replace report = "R-squared" if _n==`coefrow'
		if "`adjr2'"=="adjr2" {
			replace report = "Adjusted " + report if _n==`coefrow'
		}
	}
	
	*** addtext here
	if `"`addtext'"'!="" {
		partxtl2 `"`addtext'"'
		local temp = int((real(r(numtxt))+1)/2)
		
		local n = 1
		while `n'<=`temp' {
			local t = (`n'-1)*2+1
			local textName`n' `r(txt`t')'
			local t = `t'+1
			local textValue`n' `r(txt`t')' /* pair: stat name & value */
			local n = `n'+1
		}
		
		local i 1
		while `i'<=`temp' {
			* increase
			local coefrow = `coefrow'+1
			local N=_N
			set obs `=`N'+1'
			
			if `"`textValue`i''"'!="" {
				replace reportCol = "`textValue`i''" if _n==`coefrow'
			}
			replace report = trim(`"`textName`i''"') if _n==`coefrow'
			local i = `i'+1
		}
		
		* cleanup counting
		replace mrgrow=_n
	}
	
	*** addstat here
	if `"`addstat'"'!="" {
		local i 1
		local adeccnt : word count `adec'
		while `i'<=`naddst' {
			local coefrow = `coefrow'+1
			local aadec : word `i' of `adec'
			if "`aadec'"=="" {
				local aadec `prvadec'
			}
			if `"`astval`i''"'!="" {
				replace reportCol = "`astval`i''" if _n==`coefrow'
				if `"`decmark'"'~="" {
					replace reportCol = subinstr(reportCol,".",`"`decmark'"',.) if _n==`coefrow'
				}
			}
			replace report = trim(`"`astnam`i''"') if _n==`coefrow'
			local i = `i'+1
			local prvadec `aadec'
		}
	}
}


local parenList=trim(`"`parenList'"')

if ("`notes'"!="nonotes" & "`append'"!="append") | ("`notes'"!="nonotes" & `fileExist'==0) {
	if "`bracket'"=="bracket" | "`bracketA'" ~= "" {
		local par_bra "brackets"
	}
	else {
		local par_bra "parentheses"
	}
	
	* notes
	if "`statsList'"=="coef pval" {
		local statxt "p-values"
	}
	else if "`statsList'"=="coef se" {
		local statxt "Standard errors"
	}
	else if "`statsList'"=="coef pi" {
		local statxt "`level'% confidence intervals"
	}
	else if "`beta'"=="beta" {
		local statxt "Normalized beta coefficients"
	}
	else if "`parenList'"=="se" {
		local statxt "Standard errors"
	}
	else if "`parenList'"=="tstat" {
		if `df_r'!=. {
			local t_or_z "t"
		}
		else {
			local t_or_z "z"
		}
		local statxt "`t_or_z'-statistics"
	}
	else {
		local statxt `"`parenList'"'
	}
	
	if "`robust'"=="Robust" {
		local statxt = "Robust " + lower("`statxt'")
	}
	
	* actually inserting	
	if ("`parenList'"~="" | "`bracketList'"~="" ) & "`statsList'"~="coef" {
		if `"`paren'"'~="noparen" {
			local coefrow = `coefrow'+1
			replace report = "`statxt' in `par_bra'" if _n==`coefrow'
		}
	}
	if "`aster'"!="noaster" {
		local coefrow = `coefrow'+1
		replace report = "`astrtxt'" if _n==`coefrow'
	}
}

if (`"`addnote'"'!="" & "`append'"!="append") | (`"`addnote'"'!="" & `fileExist'==0) {
	local i 1
	while `i'<=`naddnt' {
		local coefrow = `coefrow'+1
		replace report = `"`anote`i''"' if _n==`coefrow'
		local i = `i'+1
	}
}

* attach the column name
replace report=`"`VARIABLES'"' if rowtype2[_n+1]==0
replace report=`"`VARIABLES'"' if rowtype2==0 & report[_n-1]~=`"`VARIABLES'"'


*** drop the extra rows at the end, if still exist, unless it is the bottom row
local N=_N
local temp=report[`N']
local check=rowtype2[`N']
while "`temp'"=="" & `check'>2 {
	drop in `N'
	local N=_N
	local temp=report[`N']
	local check=rowtype2[`N']
}

*** handle equationsA(auto)
if "`equationsOption'"=="auto" {
		
	*******************************cap set unabbr off
	local N=_N
	forval num=1/`N' {
		local temp=eqname[`num']
		if "`temp'"~="" {
			* check if this variable exists
			cap sum `temp', meanonly
			if _rc~=0 {
				count if eqname=="`temp'"
				local thisMany=r(N)/`statsMany'
				if `thisMany'>1 & `thisMany'<. {
					replace report ="Constant" if	eqname=="`temp'" & varname=="_cons" & report~=""
					replace report =varname if		eqname=="`temp'" & varname~="_cons" & report~=""
					replace eqname="" if eqname=="`temp'"
				}
				else {
					replace report =eqname if	eqname=="`temp'" & varname=="_cons" & report~=""
					replace eqname="" if eqname=="`temp'"
				}
			}
		}
	}
}

end		/* makeFile */


********************************************************************************************


prog define seeing
	versionSet
	version `version'

quietly {
	
	* syntax using/[, Clear]
	syntax using [, LABel LABelA(string) ]
	
	preserve
	
	insheet `using', nonames clear
	describe, short
	
	
	* number of columns
	local numcol = `r(k)'
	
	tempvar blanks rowmiss
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		local eqPlace 1
		local varPlace 2
		count if v3=="LABELS"
		if `r(N)'~=0 {
			local labPlace 3
			local num=4
		}
		else {
			local labPlace 0
			local num=3
		}
	}
	else {
		local eqPlace 0
		local varPlace 1
		
		count if v2=="LABELS"
		if `r(N)'~=0 {
			local labPlace 2
			local num=3
		}
		else {
			local labPlace 0
			local num=2
		}
	}
	
	gen int `blanks' = (trim(v`num')=="")
	forvalues col = `num'/`numcol' {
		replace `blanks' = `blanks' & (trim(v`col')=="")
	}
	
	
	* title rows
	local titleWide = 0
	if v1[1]~="" | v2[1]~="" {
		* there may be a title
		if `labPlace'==0 & `varPlace'==1 {
		      while v1[`=`titleWide'+1']~="" &  v2[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
		}
			}
		if `labPlace'==0 & `varPlace'==2 {
		      while v2[`=`titleWide'+1']~="" &  v3[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
		if `labPlace'~=0 & `varPlace'==1 {
		      while v1[`=`titleWide'+1']~="" &  v3[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
		if `labPlace'~=0 & `varPlace'==2 {
	      while v2[`=`titleWide'+1']~="" &  v4[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
	}
	
	*local VARIABLES "VARIABLES"
	* first name AFTER titles is the VARIABLES
	local content
	local num=`titleWide'+1
	local N=_N
	while `"`content'"'=="" & `num'<=`N' {
		local content=v`varPlace'[`num']
		local num=`num'+1
	}
	local VARIABLES `"`content'"'
	
	replace `blanks'=0 if  v1==`"`VARIABLES'"' | v1[_n-1]==`"`VARIABLES'"' | v2==`"`VARIABLES'"' | v2[_n-1]==`"`VARIABLES'"'
	
		
	* getting bottomBorder (the bottom border), count up
	gen rowmiss=0
	foreach var of varlist v* {
		replace rowmiss=rowmiss+1 if `var'~=""
	}
	local N=_N
	local content 1
	local num 0
	while `content'==1 & `num'<`N' {
		local content rowmiss[`=`N'-`num'']
		local num=`num'+1
	}
	* do not have to add to titleWide
	local bottomRow = `N'-`num'+1
	local bottomBorder=`bottomRow'
	
	* getting halfway to headBorder (the top border), count down
	local content
	local num=`titleWide'+1
	local N=_N
	while `"`content'"'=="" & `num'<=`N' {
		local content=v`varPlace'[`num']
		local num=`num'+1
	}
	* do not have to add to titleWide
	local headRow `num'
	local headBorder=`headRow'
	
	drop rowmiss
	
	
	* avoid counting space within each statistics row as missing
	replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 & _n >`titleWide'
	
	
	* statistics rows
	*count if `blanks'==0
	*local bottomBorder = `r(N)'+`titleWide'
	
	
	* move the notes and titles to the top of a new column
	gen str5 Notes_Titles=""
	format Notes_Titles %-20s 
	count if v1=="EQUATION"
	if `r(N)'==0 {
		* EQUATION column does not exist
		if `titleWide'>0 {
			forval num=1/`titleWide' {
				replace Notes_Titles=v1[`num'] in `num'
				replace v1="" in `num'
			}
		}
		
		local one = 1
		local legend = v1[`bottomBorder'+`one']
		
		
		local place 1
		*while "`legend'"~="" {
		local N=_N
		while `place' <= `N' {
			local place=`bottomBorder'+`one'
			local legend = v1[`place']
			replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1'
			if "`legend'"~="" {
				replace v1="" in `place'
			}
			local one = `one'+1
		}
		
		* insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column
		if "`label'"=="label" {
				*if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") {
					replace v2=v1 if v2==""
					drop v1
					describe, short
					forval num=1/`=`r(k)'-2' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES
					replace v1=`"`VARIABLES'"' if v1=="LABELS"
				*}
				local label_adjust "-1"
		}
		
		* change the string length
		gen str5 temp=""
		replace temp=v1
		drop v1
		ren temp v1
		order v1
		* format
		foreach var of varlist v1 {
			local _format= "`: format `var''"
			local _widths=substr("`_format'",2,length(trim("`_format'"))-2)
			format `var' %-`_widths's
		}
	}
	else {
		* equation column exists
		if `titleWide'>0 {
			forval num=1/`titleWide' {
				replace Notes_Titles=v2[`num'] in `num'
				replace v2="" in `num'
			}
		}
		
		local one = 1
		local legend = v2[`bottomBorder'+`one']
		while "`legend'"~="" {
			local place=`bottomBorder'+`one'
			local legend = v2[`place']
			replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1'
			if "`legend'"~="" {
				replace v2="" in `place'
			}
			local one = `one'+1
		}
		
		* insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column
		if "`label'"=="label" {
				*else if "`long'"~="long" & "`onecol'"=="onecol" {
					replace v3=v2 if v3==""
					drop v2
					describe, short
					forval num=2/`=`r(k)'-2' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES
					replace v2=`"`VARIABLES'"' if v2=="LABELS"
				*}
				local label_adjust "-1"
		}
		
		
		* change the string length
		gen str5 temp=""
		replace temp=v2
		drop v2
		ren temp v2
		order v1 v2
		* format
		foreach var of varlist v1 v2 {
			local _format= "`: format `var''"
			local _widths=substr("`_format'",2,length(trim("`_format'"))-2)
			format `var' %-`_widths's
		}
	}
	
	* clean up
	*egen `rowmiss'=rowmiss(_all)
	* rowmiss option not available in 8.2 or 8.0, do it by hand
	
	gen `rowmiss'=0
	foreach var of varlist _all {
		if "`var'"~="`rowmiss'" & "`var'"~="`blanks'" {
			replace `rowmiss'=1+`rowmiss' if `var'==""
		}
	}
	
	*drop if `rowmiss'==`numcol'+1
	
	* adjust to handle label column droppings
	*drop if `rowmiss'==`numcol'+1 & `blanks'==1
	
	* fix blanks==1 for groupvar( )
	count if `blanks'==1
	local rN=`r(N)'+1
	forval num=1/`rN' {
		replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1
	}
	
	drop if `rowmiss'==`numcol'+1 `label_adjust' & `blanks'==1
	drop `blanks' `rowmiss'
	
	browse
	
	if "`Version7'"=="" {
		* it is version 7
	}
	else if `Version7'>=11.0 {
		noi di in yel "Hit Enter to continue" _request(junk)
	}
	
	*restore, preserve
}
end  /* end of seeing */


********************************************************************************************


* 02nov2009 to handle strings
* 15dec2009 to decmark( ) added
prog define fmtgen
	
	syntax [varlist(default=none)] [in], replace(str asis) fmt(str asis) [dec(int 3) auto(int 3) less(int 0) /*
		*/ width(int 12) gen(str asis) decmark(str asis)]

if "`varlist'"~="" {
	local varname `varlist'
	replace `replace' = string(`varname',"%12.`dec'`fmt'") `in'
	
	if "`decmark'"~="" {
		replace `replace' = subinstr(`replace',".",`"`decmark'"',.) `in'
	}
}

end


********************************************************************************************


* 02nov2009 to handle strings and variables in addition to numbers
* 09nov2009 also accomodates various user-specified formats, including e
* 15dec2009 to decmark( ) added

prog define autogen
	versionSet
	version `version'
	
	syntax [varlist(default=none)] [in], replace(str asis) [dec(int 3) fmt(str asis) auto(int 3) less(int 0) /*
		*/ width(int 12) gen(str asis) decmark(str asis)]

if "`fmt'"=="" {
	local fmt f
}

if "`varlist'"~="" {
	local varname `varlist'
	
	if "`in'"~="" {
		gettoken junk begin: in, parse(" ")
		gettoken begin end: begin, parse("/")
		gettoken slash end: end, parse("/")
	}
	else {
		local begin 1
		local end=_N
		local in "in 1/`=_N'"
	}
	
	cap confirm numeric var `varname'
	
	if _rc==0 {
		tempvar whole times left aadec aadecString valstr format
		*gen `whole'=1 if round((`varname' - int(`varname')),0.0000000001)==0 
		*gen `whole'=1 if float(`varname') - int(`varname')==0
		gen `whole'=1 if round(`varname' - int(round(`varname',0.0000000001)),0.0000000001)==0
		replace `whole'=0 if `whole'==.
		
		* digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals
		gen `times'=abs(int(ln(abs(`varname'-int(`varname')))/ln(10)-1)) if `whole'==0
		
		* the whole number: take the ceiling of log 10 of absolute value
		gen `left'=int(ln(abs(`varname'))/ln(10)+1) if `whole'==0
		
		* assign the fixed decimal values into aadec
		gen `aadec'=0 if `whole'==1
			
			* reduce the left by one if more than zero to accept one extra digit
			replace `aadec'=`auto'-`left'+1 if .>`left' & `left'>0 & `left'<=`auto' & `whole'==0
			replace `aadec'=`auto'-`left'-1 if .>`left' & `left'>0 & `left'>`auto' & `whole'==0
			
			* else
			replace `aadec'=`times'+`auto'-1 if (.<=`left' | `left'<=0) & `whole'==0
			
			* needs to between 0 and 11
			replace `aadec'=`aadec'-`less'
			replace `aadec'=0 if `aadec'<0
			
			gen str12 `aadecString'=string(`aadec')
			gen str12 `valstr'=""
			
			replace `valstr'=`aadecString'+"`fmt'" if `aadec'<7 & `aadec'~=.
			if "`fmt'"=="e" {
				replace `valstr'="`=`auto'-0'e"
			}

			replace `valstr'="`=`auto'-1'e" if `aadec'>=7 & `aadec'~=.
			
			* make it exponential if too big or too negative (small)
			replace `valstr' = "`=`auto'+0'e" if `varname'>1000000 & `varname'<.
			replace `valstr' = "`=`auto'+0'e" if `varname'<-1000000 & `varname'<.
			
			gen str12 `format'= "%`width'." + `valstr' if `valstr'~=""
			
		forval num=`begin'/`end' {
			local content=`format'[`num']
			replace `replace' = string(`varname',"`content'") in `num'
		}
	}
	else {
		* string variable, do it old-fashioned way
		replace `replace'=`varname'
		forval num=`begin'/`end' {
			capture confirm number `=`varname'[`num']'
			if _rc==0 {
				autofmt, input(`=`varname'[`num']') dec(`auto') less(`less')
				if "`=`varname'[`num']'"~="" {
					replace `replace' = string(`=`varname'[`num']',"%`width'.`r(deci1)'`fmt'") if _n==`num' & "`r(deci1)'"~="."
				}
				/*
				autodigits2 `=`varname'[`num']' `auto' `less'
				if "`=`varname'[`num']'"~="" {
					replace `replace' = string(`=`varname'[`num']',"%`width'.`r(valstr)'") if _n==`num' & "`r(valstr)'"~="."
				}
				*/
				*autodigits2 tstat[`num'] `auto' `less'
				*replace tstatString = string(tstat,"%12.`r(valstr)'") in `num'
			}
		}
	}
}
else {
	* not a variable

}

if "`decmark'"~="" {
	replace `replace' = subinstr(`replace',".",`"`decmark'"',.) `in'
}
end


********************************************************************************************


* 03nov2009 integer check upgraded to handle more indeterminancy coming from string numerals
* 15dec2009 to decmark( ) added

prog define autodigits2, rclass
	versionSet
	version `version'

* getting the significant digits
args input auto less decmark

if `input'~=. {
	local times=0
	local left=0
	
	* integer checked by modified mod function
	*if round((`input' - int(`input')),0.0000000001)==0 {
	if round(`input' - int(round(`input',0.0000000001)),0.0000000001)==0 {
		local whole=1
	}
	else {
		local whole=0
		* non-interger
		 if `input'<. {
			
			* digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals
			local times=abs(int(ln(abs(`input'-int(`input')))/ln(10)-1))	
			
			* the whole number: take the ceiling of log 10 of absolute value
			local left=int(ln(abs(`input'))/ln(10)+1)
		}
	}
	
	
	* assign the fixed decimal values into aadec
	if `whole'==1 {
		local aadec=0
	}
	else if .>`left' & `left'>0 {
		* reduce the left by one if more than zero to accept one extra digit
		if `left'<=`auto' {
			local aadec=`auto'-`left'+1
		}
		else {
			local aadec=0
		}
	}
	else {
		local aadec=`times'+`auto'-1
	}
	
	if "`less'"=="" {
		* needs to between 0 and 11
		if `aadec'<0 {
			local aadec=0
		}
		*if `aadec'<11 {
		if `aadec'<7 {
			* use fixed
			local valstr "`aadec'f"
		}
		else {
			* use exponential
			local valstr "`=`auto'-1'e"
		}
	}
	else {
		* needs to between 0 and 11
		local aadec=`aadec'-`less'
		if `aadec'<0 {
			local aadec=0
		}
		*if `aadec'<10 {
		if `aadec'<7 {
			* use fixed
			local valstr "`aadec'f"
		}
		else {
			* use exponential
			local valstr "`=`auto'-1'e"
		}
	}
	
	* make it exponential if too big
	if `input'>1000000 & `input'<. {
		local valstr "`=`auto'-0'e"		
	}
	
	* make it exponential if too negative (small)
	if `input'<-1000000 & `input'<. {
		local valstr "`=`auto'-0'e"		
	}
	
	if "`decmark'"~="" {
		local valstr : subinstr local valstr "." `"`decmark'"', all
	}
	return scalar value=`aadec'
	return local valstr="`valstr'"
}
else {
	* it is a missing value
	return scalar value=.
	return local valstr="missing"
}
end


********************************************************************************************

* ripped from autofmt on 09nov2009
* autofmt 1.0.1 03nov2009 roywada@hotmail.com
* automatic formating of a significant number of digits
* 15dec2009 to decmark( ) added

prog define autofmt, rclass
version 7.0

syntax, input(string) [dec(integer 3) less(integer 0) parse(string) strict]
* parse( ) takes only one character; " " is always included as a parse

if `"`parse'"'=="" {
        local parse " "
}

local rest `"`input'"'
local count 0

if "`rest'"~="" {
        * handles the possibility the first token is empty
        gettoken first rest: rest, parse("`parse'")
        local first=trim(`"`first'"')
        if `"`first'"'==`"`parse'"' {
                local count=`count'+1
                local input`count' ""
        }
        else {
                local count=`count'+1
                local input`count' `"`first'"'
        }
}
while "`rest'"~="" {
        gettoken first rest: rest, parse("`parse'")
        local first=trim(`"`first'"')
        if `"`first'"'~=`"`parse'"' {
                local count=`count'+1
                local input`count' `"`first'"'
        }
}

if `count'==0 {
        * input( ) was left empty
        exit
}

if "`strict'"=="strict" {
	local one 0
}
else {
	local one 1
}


*** run as many times

forval num=1/`count' {

        * confirm a number
        capture confirm number `input`num''
        local rc=_rc
        
        * run if not missing and is a number
        if "`input`num''"~="." & "`input`num''"~="" & `rc'==0 {
                local times=0
                local left=0
                
                * integer checked by modified mod function
                *if round((`input`num'' - int(`input`num'')),0.0000000001)==0 {
			if round(`input' - int(round(`input',0.0000000001)),0.0000000001)==0 {
				local whole=1
			}
                else {
                        local whole=0
                        * non-interger
                         if `input`num''<. {
                                
                                * digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals
                                local times=abs(int(ln(abs(`input`num''-int(`input`num'')))/ln(10)-1))  
                                
                                * the whole number: take the ceiling of log 10 of absolute value
                                local left=int(ln(abs(`input`num''))/ln(10)+1)
                        }
                }
                
                
                * assign the fixed decimal values into aadec
                if `whole'==1 {
                        local aadec=0
                }
                else if .>`left' & `left'>0 {
                        * reduce the left by one if more than zero to accept one extra digit
                        if `left'<=`dec' {
                                local aadec=`dec'-`left'+`one'
                        }
                        else {
                                local aadec=0
                        }
                }
                else {
                        local aadec=`times'+`dec'-1
                }
                
                if "`less'"=="" {
                        * needs to between 0 and 11
                        if `aadec'<0 {
                                local aadec=0
                        }
                        *if `aadec'<11 {
                        if `aadec'<7 {
                                * use fixed
                                local fmt "`aadec'f"
                        }
                        else {
                                * use exponential
                                local fmt "`=`dec'-1'e"
                        }
                }
                else {
                        * needs to between 0 and 11
                        local aadec=`aadec'-`less'
                        if `aadec'<0 {
                                local aadec=0
                        }
                        *if `aadec'<10 {
                        if `aadec'<7 {
                                * use fixed
                                local fmt "`aadec'f"
                        }
                        else {
                                * use exponential
                                local fmt "`=`dec'-1'e"
                        }
                }
                
                * make it exponential if too big
                if `input`num''>1000000 & `input`num''<. {
                        local fmt "`=`dec'-0'e"                
                }
                
                * make it exponential if too negative (small)
                if `input`num''<-1000000 & `input`num''<. {
                        local fmt "`=`dec'-0'e"                
                }
                
                local fmt`num' `fmt'
                local aadec`num' `aadec'
                
                local output`num'=string(`input`num'',"%12.`fmt'")
                
			if "`decmark'"~="" {
				local valstr : subinstr local aadec "." `"`decmark'"', all
			}
                return scalar deci`num'=`aadec'
                return local fmt`num'="`fmt'"
                return local input`num'="`input`num''"
                
                return local output`num'=`"`output`num''"'

        }
        else {
                * it is a missing value, empty, or non-number
                local output`num'=trim(`"`input`num''"')
                
                return scalar deci`num'=.
                return local fmt`num'="."
                if "`input`num''"=="" {
                        * return a dot when empty
                        return local input`num'="."
                }
                else {
                        return local input`num'="`input`num''"
                }
                
                return local output`num'=`"`output`num''"'

        }
}
end


********************************************************************************************


prog define _texout, sortpreserve
* based on out2tex version 0.9 4oct01 by john_gallup@alum.swarthmore.edu
	versionSet
	version `version'
	
	* add one if only one v* column exists
	unab list: v*
	local count: word count `list'
	if `count'==1 {
		gen str v2=""
		order v*
	}
	if `count'==0 {
		exit
	}
	
	syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int)			/*
		*/	[texFile(string) TOtrows(int 0) Landscape Fragment NOPRetty PRetty	/*
		*/	Fontsize(numlist integer max=1 >=10 <=12) noBorder Cellborder		/*
		*/	Appendpage noPAgenum a4 a5 b5 LETter LEGal EXecutive replace		]
	if `totrows'==0 {
		local totrows = _N
	}
	local numcols : word count `varlist'
	gettoken varname statvars : varlist
	local fast 1
	
	if "`pretty'"=="pretty" {
		local pretty ""
	}
	else {
		local pretty "NOT PRETTY AT ALL"
	}
	
	local colhead1 = `titleWide' + 1
	local strow1 = `headBorder' + 1
	
	* insert $<$ to be handled in LaTeX conversion
	local N=_N
	forval num=`bottomBorder'/`N' {
		local temp=v1[`num']
		tokenize `"`temp'"', parse (" <")
		local count 1
		local newTex ""
		local noSpace 0
		while `"``count''"'~="" {
			if `"``count''"'=="<" {
				local `count' "$<$"
				local newTex `"`newTex'``count''"'
				local noSpace 1
			}
			else {
				if `noSpace'~=1 {
					local newTex `"`newTex' ``count''"'
				}
				else {
					local newTex `"`newTex'``count''"'					
					local noSpace 0
				}
			}
			local count=`count'+1
		}
		replace v1=`"`newTex'"' in `num'
	}
	
	*** replace if equation column present
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		tempvar myvar
		* use v2 instead
		replace v1 = v2 in `=`bottomBorder'+1'/`totrows'
		replace v2 = "" in `=`bottomBorder'+1'/`totrows'
		
		* change the string length
		gen str5 `myvar' =""
		replace `myvar' =v2
		drop v2
		ren `myvar' v2
		order v1 v2
	}
	
	/* if file extension specified in `"`using'"', replace it with ".tex" for output
	local next_dot = index(`"`using'"', ".")
	if `next_dot' {
		local using = substr("`using'",1,`=`next_dot'-1')
	}
	*/
	
	if `"`texFile'"'=="" {
		local endName "tex"
	}
	else {
		local endName "`texFile'"
	}
	
	local using `"using "`using'.`endName'""'
	local fsize = ("`fontsize'" != "")
	if `fsize' {
		local fontsize "`fontsize'pt"
	}
	local lscp = ("`landscape'" != "") 
	if (`lscp' & `fsize') {
		local landscape ",landscape"
	}
	local pretty	= ("`pretty'" == "")
	local cborder  = ("`cellborder'" != "")
	local noborder = ("`border'" != "")
	local nopagen  = ("`pagenum'" != "")
	local nofrag	= ("`fragment'" == "")
	
	if `cborder' & `noborder' {
		di in red "may not specify both cellborder and noborder options"
		exit 198
	}
	
	local nopt : word count `a4' `a5' `b5' `letter' `legal' `executive'
	if `nopt' > 1 {
		di in red "choose only one of a4, a5, b5, letter, legal, executive"
		exit 198 
	}
	local pagesize "`a4'`a5'`b5'`letter'`legal'`executive'"
	if "`pagesize'"=="" | "`letter'"!="" {
		local pwidth  "8.5in"
		local pheight "11in"
	}
	else if "`legal'"!="" {
		local pwidth  "8.5in"
		local pheight "14in"
	}
	else if "`executive'"!="" {
		local pwidth  "7.25in"
		local pheight "10.5in"
	}
	else if "`a4'"!="" {
		local pwidth  "210mm"
		local pheight "297mm"
	}
	else if "`a5'"!="" {
		local pwidth  "148mm"
		local pheight "210mm"
	}
	else if "`b5'"!="" {
		local pwidth  "176mm"
		local pheight "250mm"
	}
	if `lscp' {
		local temp	 "`pwidth'"
		local pwidth  "`pheight'"
		local pheight "`temp'"
	}
	if "`pagesize'"!="" {
		local pagesize "`pagesize'paper"
		if (`lscp' | `fsize') {
			local pagesize ",`pagesize'"
		}
	}
	if `cborder' & `noborder' {
		di in red "may not specify both cellborder and noborder options"
		exit 198
	}
	
	quietly {
		tempvar has_eqn st2_row last_st pad0 pad1 pad2_n padN order
		
		* replace % with \%, and _ with \_ if <2 $'s (i.e. not an inline equation: $...$
		* has_eqn indicates that varname has 2+ $'s
		
		gen byte `has_eqn' = index(`varname',"$")
		
		* make sure there are 2+ "$" in varname
		replace `has_eqn' = index(substr(`varname',`has_eqn'+1,.),"$")>0 if `has_eqn'>0
		replace `varname'= subinstr(`varname',"_", "\_", .) if !`has_eqn'
		replace `varname'= subinstr(`varname',"%", "\%", .)
		
		if `pretty' {
			replace `varname'= subinword(`varname',"R-squared", "\$R^2$", 1) in `strow1'/`bottomBorder'
			replace `varname'= subinstr(`varname'," t stat", " \em t \em stat", 1) in `bottomBorder'/`totrows'
			replace `varname'= subinstr(`varname'," z stat", " \em z \em stat", 1) in `bottomBorder'/`totrows'
		}
		
		foreach svar of local statvars { /* make replacements for column headings rows of statvars */
			replace `has_eqn' = index(`svar',"$") in `colhead1'/`headBorder'
			replace `has_eqn' = index(substr(`svar',`has_eqn'+1,.),"$")>0 in `colhead1'/`headBorder' if `has_eqn'>0
			replace `svar'= subinstr(`svar',"_", "\_", .) in `colhead1'/`headBorder' if !`has_eqn'
			replace `svar'= subinstr(`svar',"%", "\%", .) in `colhead1'/`headBorder'
			
			/* replace <, >, {, }, | with $<$, $>$, \{, \}, and $|$ in stats rows */
			/* which can be used as brackets by outstat */
			replace `svar'= subinstr(`svar',"<", "$<$", .) in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',">", "$>$", .) in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',"{", "\{", .)  in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',"}", "\}", .)  in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',"|", "$|$", .) in `strow1'/`bottomBorder'
		}
		
		if `pretty' {  /* make title fonts large; notes & t stats small */
			local blarge "\begin{large}"
			local elarge "\end{large}"
			local bfnsize "\begin{footnotesize}"
			local efnsize "\end{footnotesize}"
		}
		if `cborder' {
			local vline "|"
		}
		gen str20 `pad0' = ""
		gen str20 `padN' = ""
		if `titleWide' {
			replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`blarge'" in 1 / `titleWide'
			replace `padN' = "`elarge'} \\\" in 1 / `titleWide'
		}
		if `bottomBorder' < `totrows' {
			local noterow1 = `bottomBorder' + 1
			replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`bfnsize'" in `noterow1' / l
			replace `padN' = "`efnsize'} \\\" in `noterow1' / l
		}
		
		gen str3 `pad1' = " & " in `colhead1' / `bottomBorder'
		if `numcols' > 2 {
			gen str3 `pad2_n' = `pad1'
		}
		if `pretty' { /* make stats 2-N small font */
			local strow1 = `headBorder' + 1
			gen byte `st2_row' = 0
			replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder'	 /* only stats 2+ */
			gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "")			 /* last stats row */
			if !`cborder' {
				replace `pad0'	= "\vspace{4pt}" if `last_st'
			}
				replace `pad1'	= `pad1' + "`bfnsize'" if `st2_row'
				if `numcols' > 2 {
					replace `pad2_n' = "`efnsize'" + `pad2_n' + "`bfnsize'" if `st2_row'
				}
				replace `padN'	= "`efnsize'" if `st2_row'
			}
		
			replace `padN' = `padN' + " \\\" in `colhead1' / `bottomBorder'
			if `cborder' {
				replace `padN' = `padN' + " \hline"
			}
			else {
			if !`noborder' {
				if `headBorder' {
					if `titleWide' {
						replace `padN' = `padN' + " \hline" in `titleWide'
					}
					replace `padN' = `padN' + " \hline" in `headBorder'
				}
				replace `padN' = `padN' + " \hline" in `bottomBorder'
			}
		}
		
		local vlist "`pad0' `varname' `pad1'"
		tokenize `statvars'
		local ncols_1 = `numcols' - 1
		local ncols_2 = `ncols_1' - 1
		forvalues v = 1/`ncols_2' {
			local vlist "`vlist' ``v'' `pad2_n'"
		}
		local vlist "`vlist' ``ncols_1'' `padN'"
		
		local texheadfootrows = `nofrag' + `pretty' + 1	/* in both headers and footers */ 
		local texheadrow = 2 * `nofrag' + `nopagen' + `texheadfootrows'
		local texfootrow = `texheadfootrows'
		local newtotrows = `totrows' + `texheadrow' + `texfootrow'
		if `newtotrows' > _N {
			local oldN = _N
			set obs `newtotrows'
		}
		else {
			local oldN = 0
		}
		gen long `order' = _n + `texheadrow' in 1 / `totrows'
		local newtexhrow1 = `totrows' + 1
		local newtexhrowN = `totrows' + `texheadrow'
		replace `order' = _n - `totrows' in `newtexhrow1' / `newtexhrowN'
		sort `order'
		
		
		* insert TeX header lines
		local ccc : display _dup(`ncols_1') "`vline'c"
		if `nofrag' {
			replace `pad0' = "\documentclass[`fontsize'`landscape'`pagesize']{article}" in 1
			replace `pad0' = "\setlength{\pdfpagewidth}{`pwidth'} \setlength{\pdfpageheight}{`pheight'}" in 2
			replace `pad0' = "\begin{document}" in 3
			replace `pad0' = "\end{document}" in `newtotrows'  
		}
		if `nopagen' {
			local row = `texheadrow' - 1 - `pretty'
			replace `pad0' = "\thispagestyle{empty}" in `row'
		}
		if `pretty' {
			local row = `texheadrow' - 1
			replace `pad0' = "\begin{center}" in `row'
			local row = `newtotrows' - `texfootrow' + 2
			replace `pad0' = "\end{center}"	in `row'
		}
		local row = `texheadrow'
		replace `pad0' = "\begin{tabular}{`vline'l`ccc'`vline'}" in `row'
		if (!`titleWide' | `cborder') & !`noborder' {
			replace `pad0' = `pad0' + " \hline" in `row'
		}
		local row = `newtotrows' - `texfootrow' + 1
		replace `pad0' = "\end{tabular}" in `row'
		
		outfile `vlist' `using' in 1/`newtotrows', `replace' runtogether
		
		* delete new rows created for TeX table, if any
		if `oldN' {
			keep in 1/`totrows'
		}
	} /* quietly */
end  /* end _texout */


********************************************************************************************


prog define out2rtf2, sortpreserve rclass

	versionSet
	version `version'

* based on version 0.9 4oct01 by john_gallup@alum.swarthmore.edu
	syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int)		/*
		*/	[wordFile(string) TOtrows(int 0) Landscape Fragment noPRetty	/*
		*/	Fontsize(numlist max=1 >0) noBorder Cellborder				/*
		*/	Appendpage PAgesize(string)							/*
		*/	Lmargin(numlist max=1 >=0.5) Rmargin(numlist max=1 >=0.5)		/*
		*/	Tmargin(numlist max=1 >=0.5) Bmargin(numlist max=1 >=0.5)		/*
		*/	replace]
		if `totrows'==0 {
			local totrows = _N
		}
	local numcols : word count `varlist'
	gettoken varname statvars : varlist
	local fast 1
	
	local colhead1 = `titleWide' + 1
	local strow1 = `headBorder' + 1
	
	
	*** replace if equation column present
	local hack 0
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		* use v2 instead
		replace v1 = v2 in `=`bottomBorder'+1'/`totrows'
		replace v2 = "" in `=`bottomBorder'+1'/`totrows'
		
		* change the string length
		gen str5 myvar =""
		replace myvar =v2
		drop v2
		ren myvar v2
		order v1 v2
		
		local hack 1
	}
	
	/* if file extension specified in `using', replace it with ".rtf" for output
	local next_dot = index("`using'", ".")
	if `next_dot' {
		local using = substr("`using'",1,`=`next_dot'-1')
	}
	*/
	
	if `"`wordFile'"'=="" {
		local endName "rtf"
	}
	else {
		local endName "`wordFile'"
	}
	
	local using `"using "`using'.`endName'""'
	return local documentname `"`using'"'
	
	if "`fontsize'" == "" {
		local fontsize "12"
	}
	
	local lscp = ("`landscape'" != "") 
	local pretty	= ("`pretty'" == "")
	local cborder  = ("`cellborder'" != "")
	local noborder = ("`border'" != "")
	local stdborder = (!`noborder' & !`cborder')
	local nopagen  = ("`pagenum'" != "")
	local nofrag	= ("`fragment'" == "")
	
	
	if `cborder' & !`noborder' {
		di in red "may not specify both cellborder and noborder options"
		exit 198
	}
	
	* reformat "R-squared" and italicize "t" or "z"
	if `pretty' {
		quietly {
			replace `varname'= subinword(`varname',"R-squared", "{\i R{\super 2}}", 1) in `strow1'/`bottomBorder'
			replace `varname'= subinstr(`varname'," t stat", " {\i t} stat", 1) in `bottomBorder'/`totrows'
			replace `varname'= subinstr(`varname'," z stat", " {\i z} stat", 1) in `bottomBorder'/`totrows'
		}
	}
	
	* font sizes in points*2
	local font2 = int(`fontsize'*2)
	if `pretty' {
		/* make title fonts large; notes & t stats small */
		local fslarge = "\fs" + string(int(`font2' * 1.2))
		local fsmed	= "\fs" + string(`font2')
		local fssmall = "\fs" + string(int(`font2' * 0.8))
		local sa0 "\sa0"	/* put space after t stats rows */
		local gapsize = int(`fontsize'*0.4*20)  /* 40% of point size converted to twips */
		local sa_gap "\sa`gapsize'"
	}
	else {
		local fs0 = "\fs" + string(`font2')
	}
	
	local onecolhead = (`headBorder' - `titleWide' == 1)
			/* onecolhead = true if only one row of column headings */
	if `stdborder' {
		if !`onecolhead' {
			* runs here
			*local trbrdrt "\clbrdrt\brdrs"	/* table top is overlined */
			*local trbrdrt "\trbrdrt\brdrs"	/* table top is overlined */
			
			local clbrdr_uo "\clbrdrt\brdrs"	/* cells are overlined */
			local clbrdr_ul "\clbrdrb\brdrs"	/* cells are underlined */
		}
		else {
			/* cells are over- and underlined */
			local clbrdr_ul "\clbrdrt\brdrs\clbrdrb\brdrs"
		
		}
		local trbrdrb "\trbrdrb\brdrs"
	}
	if `cborder' {
		/* if !cborder then clbrdr is blank */
		local clbrdr "\clbrdrt\brdrs\clbrdrb\brdrs\clbrdrl\brdrs\clbrdrr\brdrs"
	}
	
	* figure out max str widths to make cell boundaries
	* cell width in twips = (max str width) * (pt size) * 12
	* (12 found by trial and error)
	local twipconst = int(`fontsize' * 12 )
	tempvar newvarname
	qui gen str80 `newvarname' = `varname' in `strow1'/`bottomBorder'
	
	local newvarlist "`newvarname' `statvars'"
	qui compress `newvarlist'
	local cellpos = 0
	foreach avar of local newvarlist {
		local strwidth : type `avar'
		local strwidth = subinstr("`strwidth'", "str", "", .)
		local strwidth = `strwidth' + 1  /* add buffer */
		local cellpos = `cellpos' + `strwidth'*`twipconst'

		* hacking
		if `hack'==1 & "`avar'"=="`newvarname'" & `cellpos'<1350 {
			local cellpos=1350 
		}
		local clwidths "`clwidths'`clbrdr'\cellx`cellpos'"
		
		* put in underline at bottom of header in clwidth_ul
		local clwidth_ul "`clwidth_ul'`clbrdr_ul'\cellx`cellpos'"
		
		* put in overline
		local clwidth_ol "`clwidth_ol'`clbrdr_uo'\cellx`cellpos'"
	}
	
	if `stdborder' {
		if `onecolhead' {
			local clwidth1 "`clwidth_ul'"
		}
		else {
			local clwidth1 "`clwidths'"
			local clwidth2 "`clwidth_ul'"
		}
		local clwidth3 "`clwidths'"
	}
	else{
		local clwidth1 "`clwidths'"
	}
	
	* statistics row formatting
	tempvar prettyfmt
	qui gen str12 `prettyfmt' = ""  /* empty unless `pretty' */
	if `pretty' {
		* make stats 2-N small font
		tempvar st2_row last_st
		quietly {
			gen byte `st2_row' = 0
			replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder'	 /* only stats 2+ */
			gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "")			 /* last stats row */
			replace `prettyfmt' = "`sa0'" in `strow1' / `bottomBorder'
			replace `prettyfmt' = "`sa_gap'"  if `last_st' in `strow1' / `bottomBorder'
			replace `prettyfmt' = `prettyfmt' + "`fsmed'" if !`st2_row' in `strow1' / `bottomBorder'
			replace `prettyfmt' = `prettyfmt' + "`fssmall'"  if `st2_row' in `strow1' / `bottomBorder'
		}
	}
	
	* create macros with file write contents
	
	forvalues row = `colhead1'/`bottomBorder' { 
		local svarfmt`row' `"(`prettyfmt'[`row']) "\ql " (`varname'[`row']) "\cell""'
		foreach avar of local statvars {
			local svarfmt`row' `"`svarfmt`row''"\qc " (`avar'[`row']) "\cell""' 
		}
		local svarfmt`row' `"`svarfmt`row''"\row" _n"'
	}
	
	* write file
	tempname rtfile
	cap file open `rtfile' `using', write `replace'
	if _rc==608 {
		noi di in red `"file `using' is read-only; cannot be modified or erased"'
		noi di in red `"The file needs to be closed if being used by another software such as Word."'
		exit 608
	}
	
	file write `rtfile' "{\rtf1`fs0'" _n  /* change if not roman: \deff0{\fonttbl{\f0\froman}} */
	
	* title
	if `titleWide' {
		file write `rtfile' "\pard\qc`fslarge'" _n
		forvalues row = 1/`titleWide' {
			file write `rtfile' (`varname'[`row']) "\par" _n
		}
	}
	
	* The top line
	file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth_ol'" _n
	*file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth1'" _n
	
	local headBorder_1 = `headBorder' - 1
	* write header rows 1 to N-1
	
	forvalues row = `colhead1'/`headBorder_1' {
		file write `rtfile' `svarfmt`row''
		* turn off the overlining the first time it's run
		file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n
	}
	file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth2'" _n
	
	* write last header row
	file write `rtfile' `svarfmt`headBorder''

	local bottomBorder_1 = `bottomBorder' - 1
	/* turn off cell underlining */
	file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n
	
	* table contents
	forvalues row = `strow1'/`bottomBorder_1' {
		file write `rtfile' `svarfmt`row''
	}
	
	if `stdborder' {
		/* write last row */
		*file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidths'" _n
		* make it underline
		file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidth_ul'" _n
		file write `rtfile' `svarfmt`bottomBorder''
	}
	
	/* write notes rows */
	if `bottomBorder' < `totrows' {
		local noterow1 = `bottomBorder' + 1
		file write `rtfile' "\pard\qc`fssmall'" _n
		forvalues row = `noterow1'/`totrows' {
			file write `rtfile' (`varname'[`row']) "\par" _n
		}
	}
	
	* write closing curly bracket
	file write `rtfile' "}"
end  /* end out2rtf2 */


********************************************************************************************


prog define _xmlout
	versionSet
	version `version'

* emulates the output produced by xmlsave:
* xmlsave myfile, replace doctype(excel) legible

syntax using/ [, excelFile(string) LEGible noNAMes titleWide(integer 0) /*
	*/ headBorder(integer 10) bottomBorder(integer 10)  ]

* assumes all columns are string; if numbers, then the format needs to be checked

*local legible legible

if "`legible'"=="legible" {
	local _n "_n"
}

tempname source saving

if `"`excelFile'"'=="" {
	local endName "xml"
}
else {
	local endName "`excelFile'"
}
	
local save `"`using'.`endName'"'

*file open `source' using `"`using'"', read
cap file open `saving' using `"`save'"', write text replace

if _rc==608 {
	noi di in red `"file `save' is read-only; cannot be modified or erased"'
	noi di in red `"The file needs to be closed if being used by another software such as Excel."'
	exit 608
}

*file write `saving' `"`macval(line)'"'
file write `saving' `"<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>"' `_n'
file write `saving' `"<?mso-application progid="Excel.Sheet"?>"' `_n'
file write `saving' `"<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet""' `_n'
file write `saving' `" xmlns:o="urn:schemas-microsoft-com:office:office""' `_n'
file write `saving' `" xmlns:x="urn:schemas-microsoft-com:office:excel""' `_n'
file write `saving' `" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet""' `_n'
file write `saving' `" xmlns:html="http://www.w3.org/TR/REC-html40">"' `_n'
file write `saving' `"<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">"' `_n'
file write `saving' `"<Author></Author>"' `_n'
file write `saving' `"<LastAuthor></LastAuthor>"' `_n'
file write `saving' `"<Created></Created>"' `_n'
file write `saving' `"<LastSaved></LastSaved>"' `_n'
file write `saving' `"<Company></Company>"' `_n'
file write `saving' `"<Version></Version>"' `_n'
file write `saving' `"</DocumentProperties>"' `_n'
file write `saving' `"<ExcelWorkbook  xmlns="urn:schemas-microsoft-com:office:excel">"' `_n'
file write `saving' `"<ProtectStructure>False</ProtectStructure>"' `_n'
file write `saving' `"<ProtectWindows>False</ProtectWindows>"' `_n'
file write `saving' `"</ExcelWorkbook>"' `_n'
file write `saving' `"<Styles>"' `_n'

* styles
file write `saving' `"<Style ss:ID="Default" ss:Name="Normal">"' `_n'
file write `saving' `"<Alignment ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<Borders/>"' `_n'
file write `saving' `"<Font/>"' `_n'
file write `saving' `"<Interior/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Protection/>"' `_n'
file write `saving' `"</Style>"' `_n'

* bold & (center)
file write `saving' `"<Style ss:ID="s1">"' `_n'
*file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<Font ss:Bold="1" ss:Size='12'/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'

* top border & center
file write `saving' `"<Style ss:ID="s21">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

* main body (no border) & center
file write `saving' `"<Style ss:ID="s22">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'

* bottom border & center
file write `saving' `"<Style ss:ID="s23">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

* goldfish (no border, left-justified)
file write `saving' `"<Style ss:ID="s24">"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'

* top border
file write `saving' `"<Style ss:ID="s31">"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

* main body (no border)
file write `saving' `"<Style ss:ID="s32">"' `_n'
file write `saving' `"<Borders/>"' `_n'
file write `saving' `"</Style>"' `_n'

* bottom border & center
file write `saving' `"<Style ss:ID="s33">"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

file write `saving' `"</Styles>"' `_n'
file write `saving' `"<Names>"' `_n'
file write `saving' `"</Names>"' `_n'
file write `saving' `"<Worksheet ss:Name="Sheet1">"' `_n'

* set up file size
qui describe, short

local N=_N
local tableN `N'

if "`names'"~="nonames" {
	* add one if variable names are to be inserted
	local tableN=`N'+1
}
else {
	* add one for the look
	local tableN=`N'+1
}

file write `saving' `"<Table ss:ExpandedColumnCount="`r(k)'" ss:ExpandedRowCount="`tableN'""' `_n'
file write `saving' `" x:FullColumns="1" x:FullRows="1">"' `_n'

* should be tostring and format here if dealing with numbers
	
	ds8
	
	* write the variable names at the top or empty row
	if "`names'"~="nonames" {
		file write `saving' `"<Row>"' `_n'
		foreach var in  `dsVarlist' {
			if "`Version7'"~="" {
				file write `saving' `"<Cell ss:StyleID="s1"><Data ss:Type="String">`macval(var)'</Data></Cell>"' _n
			}
			else {
				file write `saving' `"<Cell ss:StyleID="s1"><Data ss:Type="String">`var'</Data></Cell>"' _n				
			}
		}
		file write `saving' `"</Row>"' `_n'
	}
	else {
		file write `saving' `"<Row>"' `_n'
		file write `saving' `"</Row>"' `_n'
	}


* title
local count `titleWide'
local total 1
while `count'~=0 {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`total') n(`N') style(`" ss:StyleID="s1""') style1(`" ss:StyleID="s1""')
	local count=`count'-1
	local total=`total'+1
}

* top border
local count=`total'
forval num=`count'/`count' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""')
	local total=`total'+1
}

* ctitle
local count=`total'
forval num=`count'/`headBorder' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""')
	local total=`total'+1
}

* top border (closes ctitle)
local count=`total'
forval num=`count'/`count' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""')
	local total=`total'+1
}

* body
local count=`total'
forval num=`count'/`=`bottomBorder'-1' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""')
	local total=`total'+1
}

* bottom border (closes body)
local count=`total'
forval num=`count'/`count' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s23""') style1(`" ss:StyleID="s33""')
	local total=`total'+1
}

* goldfish
if `N'>`total' {
	local count=`total'
	forval num=`count'/`N' {
		xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s24""') style1(`" ss:StyleID="s24""') 
		local total=`total'+1
	}
}

/*
forval num=1/`N' {
	
	file write `saving' `"<Row>"' `_n'
	
	*foreach var in  `=r(varlist)' {
	foreach var in  `dsVarlist' {
		
		*local stuff `=`var'[`num']'
		local stuff=`var' in `num'
		
		local stuff : subinstr local stuff "<" "&lt;", all
		local stuff : subinstr local stuff ">" "&gt;", all
		
		* the main body
		if "`Version7'"~="" {
			file write `saving' `"<Cell`style'><Data ss:Type="String">`macval(stuff)'</Data></Cell>"' `_n'
		}
		else {
			file write `saving' `"<Cell`style'><Data ss:Type="String">`stuff'</Data></Cell>"' `_n'
		}
	}
	file write `saving' `"</Row>"' `_n'
}
*/

file write `saving' `"</Table>"' `_n'
file write `saving' `"<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">"' `_n'
file write `saving' `"<ProtectedObjects>False</ProtectedObjects>"' `_n'
file write `saving' `"<ProtectedScenarios>False</ProtectedScenarios>"' `_n'
file write `saving' `"</WorksheetOptions>"' `_n'
file write `saving' `"</Worksheet>"' `_n'
file write `saving' `"</Workbook>"' `_n'

* close out with the last line
*file write `saving' _n
*file close `source'

file close `saving'

end /* _xmlout */


********************************************************************************************


prog define xmlstack

syntax, saving(string) dsVarlist(string) num(numlist) n(numlist) style(string) style1(string)

local N `n'

*forval num=1/`N' {
	
	file write `saving' `"<Row>"' `_n'
	
	local count 0
	
	*foreach var in  `=r(varlist)' {
	foreach var in  `dsVarlist' {
		
		if `count'==0 {
			local STYLE `"`style1'"'
		}
		else {
			local STYLE `"`style'"'
		}
		
		*local stuff `=`var'[`num']'
		local stuff=`var' in `num'
		
		local stuff : subinstr local stuff "<" "&lt;", all
		local stuff : subinstr local stuff ">" "&gt;", all
		
		* the main body
		if "`Version7'"~="" {
			file write `saving' `"<Cell`STYLE'><Data ss:Type="String">`macval(stuff)'</Data></Cell>"' `_n'
		}
		else {
			file write `saving' `"<Cell`STYLE'><Data ss:Type="String">`stuff'</Data></Cell>"' `_n'
		}
		
		local count=`count'+1
	}
	file write `saving' `"</Row>"' `_n'
*}

end /* xmlstack */


********************************************************************************************


prog define dsCol
	* gets you the number of columns like cret does for version 8
	* alternatively use -describe, short- and r(k)
	
	version 7.0
	cap local ck `c(k)'
	
	if "`ck'"=="" {
		local ck 0
		foreach var of varlist _all {
			local ck=`ck'+1
		}
	}
	c_local ck `ck'
end


********************************************************************************************


prog define ds8
	* get you the list of variable like -ds- does for version 8
	version 7.0
	qui ds
	if "`r(varlist)'"=="" {
		local dsVarlist ""
		foreach var of varlist _all {
			local dsVarlist "`dsVarlist' `var'"
		}
		c_local dsVarlist `dsVarlist'
	}
	else {
		c_local dsVarlist `r(varlist)'
	}
end


********************************************************************************************


prog define _tab3, eclass
	* get you tabulations
	versionSet
	version `version'
	
syntax varlist 							/*
	*/ [if] [in] [using] [,					/*
	*/ APpend REPLACE esample drop(string) 		/*
	*/ DISplay log regress]
	
	
qui {

if "`drop'"~="" {
	ds `drop'
	local drop `r(varlist)'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}

* checking the height
local varCount: word count `varlist'
if `=`varCount'*100'>=`=_N' {
	preserve
	set obs `=`varCount'*100+2'
}



if `=_by()'==1 {
	* eliminate -by- variables from varlist
	local drop `_byvars'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}

*marksample touse
*marksample alluse, noby

tempvar touse alluse

mark `touse' `if' `in' [`weight'`exp']
mark `alluse'  `if' `in' [`weight'`exp'], noby

** restricting to e(sample)
if "`noesample'"=="noesample" {
	replace `touse'=0 if e(sample)~=1
	replace `alluse'=0 if e(sample)~=1
}

tempvar stacker name label frequency percent cumulative total
tempname val_mat freq_mat ebmat eVmat 

	
gen `stacker'=.
gen str5 `name'=""

gen `label'=.
gen `frequency'=.

gen `percent'=.
gen `cumulative'=.

gen `total'=.


local varname ""

noi tabulate `varlist' [`weight'`exp'] if `touse', matrow(`val_mat') matcell(`freq_mat')

if r(N)~=0 {
	noi tabulate `varlist' [`weight'`exp'] if `touse', matrow(`val_mat') matcell(`freq_mat')
	
	local stuff `r(r)'
	forval row=1/`stuff' {
		*replace `name' = "r`row'" in `row'
		
		local content = `val_mat'[`row',1]
		replace `label' =`content' in `row'
		
		replace `name' = string(`val_mat'[`row',1]) in `row'
		local varname "`varname' `content'"
		
		local content = `freq_mat'[`row',1]
		replace `frequency' =`content' in `row'
	}
	replace `total'=sum(`frequency')
	qui sum `varlist', meanonly
	replace `percent'=100*`frequency'/`r(N)'
	replace `cumulative'=sum(`percent') if `label'~=.
}



*mat list `val_mat'
*mat list `freq_mat'
	
	local colVarname ""
	foreach col in obs mean sd min max {
		foreach var in `varname' {
			local colVarname "`colVarname' `col':`var'"
		}
	}
	
	count if `name'~=""
	
	replace `stacker'=`label'
	forval num=1/`=r(N)' {
		replace `stacker'=`frequency'[`num'] in `=r(N)+`num''
		replace `stacker'=`percent'[`num'] in `=r(N)*2+`num''
		replace `stacker'=`cumulative'[`num'] in `=r(N)*3+`num''
	}
	
	if "`display'"=="display" {
	noi tabulate `varlist' [`weight'`exp'] if `touse'
}
if `=_by()'==1 {
	* generate column heading when -by- specified
	local cc=1
	local ctitleList ""
	
	tokenize `_byvars'
	while "``cc''"~="" {
		
		* should there be `touse' here?
		qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse'
		if r(N)<. {
			local actual`cc' =r(mean)
		}
		else {
			local actual`cc' =.			
		}
		
		* place ctitle in there
		local ctitleList "`ctitleList' ``cc'' `actual`cc'' "
		local cc=`cc'+1
	}
	
	* replace last if -by- specified
	if `=_byindex()'~=1 & "`replace'"=="replace" {
		local replace ""
	}
}

count if `stacker'~=.

if r(N)>0 {
	* recycling name: they exist in variables and matrix
	
	if "`log'"=="log" {
		

		
		mkmat `stacker' in 1/`=r(N)', matrix(`ebmat')
		mkmat `empty' in 1/`=r(N)', matrix(`eVmat')
		
		mat rownames `ebmat'=`colVarname'
		mat rownames `eVmat'=`colVarname'
		
		mat colnames `ebmat'=y1
		mat colnames `eVmat'=y1
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	else {
		count if `name'~=""
		
		* `=r(N)' gets wiped out in version 7
		local rN=r(N)
		
		mkmat `frequency' in 1/`rN', matrix(`ebmat')
		mkmat `percent' in 1/`rN', matrix(`eVmat')
		
		mat rownames `ebmat'=`varname'
		mat rownames `eVmat'=`varname'
		
		mat colnames `ebmat'=y1
		mat colnames `eVmat'=y1
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	
	if "`replace'"=="replace" {
		if "`Version7'"=="" {
			est mat freq `ebmat'
			est mat percent `eVmat'
			
			count if `touse'==1
			est scalar total = `total'[_N]
		}
		else {
			eret clear
			*eret mat b=`ebmat'
			*eret mat V=`eVmat'
			
			eret post b V
			if `"`if'"'~="" {
				eret local depvar `"`if'"'
			}
			else {
				eret local depvar `"Tabulate"'
			}
			eret local cmd "tab3"
			
			count if `touse'==1
			eret scalar total = `total'[_N]
		}
	}
	else {
		if "`Version7'"=="" {
			est mat freq `ebmat'
			est mat percent `eVmat'
			
			count if `touse'==1
			est scalar total = `total'[_N]
		}
		else {
			eret mat freq=`ebmat'
			eret mat percent=`eVmat'
			
			count if `touse'==1
			eret scalar total = `total'[_N]
		}
	}
}
else {
	* no observation
	if "`Version7'"=="" {
		mat def `ebmat'=(0)
		mat def `eVmat'=(0)
		mat colnames `ebmat'="MISSING"
		mat colnames `eVmat'="MISSING"
		est mat freq `ebmat'
		est mat percent `eVmat'
		est scalar total=0
	}
	else {
		mat def `ebmat'=(0)
		mat def `eVmat'=(0)
		mat colnames `ebmat'="MISSING"
		mat colnames `eVmat'="MISSING"
		eret mat freq=`ebmat'
		eret mat percent=`eVmat'
		eret scalar total=0
	}
}
} /* qui */
noi di

end /* _tab3 */


********************************************************************************************


* Jan2009 by roywada@hotmail.com
* 24mar2010 content( ) is no longer required

prog define optionSyntax
	* cleans the options within parenthetical options of the form -option( )-
	* clean c_locals of those content names as if they were the options
	
	* valid: allowed contents in parenthesis
	* name: name of the option
	* content: actual user input into the option
	* passthru: if it was passtru rather than string
	* nameShow: mesaage to user when invalid
	
	syntax, valid(string) name(string) nameShow(string) [content(string) PASSthru NORETURN]
	
	if "`content'"=="" {
		local content
	}
	
	* take comma out
	if "`passthru'"=="passthru" {
		local content : subinstr local content "`name'(" " ", all
		local content : subinstr local content ")" " ", all
		local content : subinstr local content "," " ", all
	}
	else {
		* just string
		local content : subinstr local content "," " ", all
	}
	
	local thisMany : word count `content'
	local num=1
	local optionList ""
	
	while `num'<=`thisMany' {
		local option`num' : word `num' of `content'
		
		* it must be one of the list
		local test 0
		foreach var in `valid' {
			if "`var'"=="`option`num''" & `test'==0 {
				local test 1
			}
		}
		
		if `test'==0 {
			noi di in white "`option`num''" in red " is not a valid option or matrix for {opt `nameShow'}"
			exit 198
		}
		local optionList "`optionList' `option`num''"
		local num=`num'+1
	}
	
	if "`noreturn'"~="noreturn" {
		foreach var in `valid' {
			* clears the c_locals
			c_local `var' ""
		}
		
		foreach var in `optionList' {
			* inserts the c_locals
			c_local `var' "`var'"
		}
	}
	
	c_local optionList `"`optionList'"'
	c_local optionCount : word count `optionList'

end


********************************************************************************************


* sum2 1.0.0 Jan2009 by roywada@hotmail.com
* sum2 1.0.1 21oct2009 : gets the entire varlist if no e(b) exists
*				raw option

prog define _sum2, eclass
*prog define sum2, eclass by(recall) sortpreserve
	versionSet
	version `version'

syntax [varlist] [using] [if] [in] [pweight aweight iweight] [,	/*
	*/ APpend REPLACE esample drop(string) 				/*
	*/ noDISplay log REGress DETail NODEPendent raw]


local _0 `"`0'"'


qui {


if "`log'"=="log" & "`detail'"=="detail" {
	noi di in red "cannot choose both {opt det:ail} and {opt log}"
	exit 198
}

if "`log'"~="log" & "`detail'"~="detail" {
	local regress "regress"
}


if "`regress'"=="regress" {
	* check for prior sum2, replace
	foreach var in eqlist {
		if "`e(cmd)'"=="sum2, log" {
			if "`Version7"~="" {
				*eret list
			}
			else {
				*est list
			}
			noi di in red "no regression detected; already replaced with summary"
			exit 198
		}
	}
	
	*** replace varlist with e(b) names
	regList `_0'
	
	local varlist `r(varlist)'
	local eqlist `r(eqlist)'
	
	local varnum `r(varnum)'
	local eqnum `r(eqnum)'
}
else {
	local varnum: word count `varlist'
	local eqnum 0

}

local varlist `"`eqlist' `varlist'"'

	
* take tempvars out
tsunab stuff : __00*

macroMinus `varlist', names(varlist) subtract(`stuff')
local varnum: word count `varlist'

* extender
local N=_N
version 7: describe, short
if `r(k)'>`N'+1 & `r(k)'<. {
	set obs `r(k)'
}


if "`drop'"~="" {
	ds `drop'
	local drop `r(varlist)'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}



if `=_by()'==1 {
	* eliminate -by- variables from varlist
	local drop `_byvars'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}


*marksample touse
*marksample alluse, noby
*tempvar touse alluse

tempvar touse
*mark `alluse'  `if' `in', noby

cap confirm matrix e(b)
if _rc | "`raw'"=="raw" {
	mark `touse' `if' `in' [`weight'`exp']
}
else {
	* always esample restricted
	if `"`if'"'~="" {
		mark `touse' `if' & e(sample) `in' [`weight'`exp']
	}
	else {
		mark `touse' if e(sample) `in' [`weight'`exp']
	}
}

count if `touse'==1
if `r(N)'==0 {
	noi di in red "no observation left; check your if/in conditionals"
	exit 198
}

*** must take out string variables prior to marking them
local stringList ""
local noobsList ""
local anyObs 0
foreach var in `varlist' {
	sum `var' if `touse' [`weight'`exp'], meanonly
	if r(N)==0 {
		local minus "`var'"
		*cap local varlist: list varlist - minus
		macroMinus `varlist', names(varlist) subtract(`minus')
		
		if "`Version7'"=="" {
			local varlist=subinstr("`varlist'","`minus'","",.)
		}
		
		local type: type `var'
		local check= substr("`type'",1,3)
		
		* display later
		if "`check'"=="str" {
			*noi di in yellow "`var' is string, not included"
			local stringList "`stringList' `var'"
		}
		else {
			*noi di in yellow "`var' has no observation, not included"
			local noobsList "`noobsList' `var'"
		}
	}
	else {
		local anyObs 1
	}
	local varnum: word count `varlist'
}

tempvar name N mean sd min max zeros
tempname ebmat eVmat 
tempvar sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99

local varname ""

foreach var in `varlist' {
	qui sum `var' if `touse' [`weight'`exp'], `detail'
	if r(N)~=0 {
		local varname "`varname' `var'"
		local row=`row'+1
		
		foreach var in mean sd N min max {
			mat ``var'' = nullmat(``var'') \ r(`var')
		}
		mat `zeros' = nullmat(`zeros') \ 0
	}
	if "`detail'"=="detail" & r(N)~=0 {
		foreach var in sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 {
			mat ``var'' = nullmat(``var'') \ r(`var')
		}
	}
}

* rename them
if "`regress'"=="regress" {
	foreach var in mean sd N min max {
	mat rownames ``var''=`varname'
	mat colnames ``var''=`var'
	}
}
if "`log'"=="log" {
	foreach var in N mean sd min max {
		mat rownames ``var''=`varname'
		mat roweq ``var''=`var'
		mat colnames ``var''=`var'
	}
}
if "`detail'"=="detail" {
	foreach var in N mean sd min max sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 {
		mat rownames ``var''=`varname'
		mat roweq ``var''=`var'
		mat colnames ``var''=`var'
	}
}

if "`display'"~="nodisplay" & `anyObs'==1 {
	noi sum `varlist' if `touse' [`weight'`exp'], `detail'
}


if `=_by()'==1 {
	* generate column heading when -by- specified
	local cc=1
	local ctitleList ""
	
	tokenize `_byvars'
	while "``cc''"~="" {
		
		* should there be `touse' here?
		qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse'
		if r(N)<. {
			local actual`cc' =r(mean)
		}
		else {
			local actual`cc' =.			
		}
		
		* place ctitle in there
		local ctitleList "`ctitleList' ``cc'' `actual`cc'' "
		local cc=`cc'+1
	}
	
	* replace last if -by- specified
	if `=_byindex()'~=1 & "`replace'"=="replace" {
		local replace ""
	}
}

	* exporting temp matrices	
	if "`regress'"=="regress" {
		mat `ebmat' = `mean'
		mat `eVmat' = `sd'
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	else if "`log'"=="log" {
		foreach var in N mean sd min max {
			mat `ebmat' = nullmat(`ebmat') \ ``var'' 
			mat `eVmat' = nullmat(`eVmat') \ `zeros'
		}
		
		* rename eVmat after ebmat
		local colnames: colnames `ebmat'
		local roweq: roweq `ebmat'
		local rownames: rownames `ebmat'
		
		mat colnames `eVmat'=`colnames'		
		mat roweq `eVmat'=`roweq'
		mat rownames `eVmat'=`rownames'
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	else if "`detail'"=="detail" {
		foreach var in N mean sd min max sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 {
			mat `ebmat' = nullmat(`ebmat') \ ``var''
			mat `eVmat' = nullmat(`eVmat') \ `zeros'
		}
		
		* rename eVmat after ebmat
		local colnames: colnames `ebmat'
		local roweq: roweq `ebmat'
		local rownames: rownames `ebmat'
		
		mat colnames `eVmat'=`colnames'		
		mat roweq `eVmat'=`roweq'
		mat rownames `eVmat'=`rownames'
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	
	if "`replace'"=="replace" {
		if "`Version7'"=="" {
			est mat mean `ebmat'
			est mat Var `eVmat'
			
			count if `touse'==1
			est scalar N = r(N)
		}
		else {
			eret clear
			mat b=`ebmat'
			mat V=`eVmat'
			mat list b
			eret post b V
			if `"`if'"'~="" {
				gettoken first second: if, parse(" ")
				eret local depvar `"`second'"'
			}
			else {
				eret local depvar `"Summary"'
			}
			eret local cmd "sum2, log"
			
			if "`regress'"=="regress" {
				count if `touse'==1
				eret scalar N = r(N)
			}
		}
	}
	else {
		if "`Version7'"=="" {
			est mat mean `ebmat'
			est mat Var `eVmat'
			
			if "`regress'"=="regress" {
				count if `touse'==1
				est scalar sum_N = r(N)
			}
		}
		else {
			eret mat mean=`ebmat'
			eret mat Var=`eVmat'
			
			if "`regress'"=="regress" {
				count if `touse'==1
				eret scalar sum_N = r(N)
			}
		}
	}

/*
else {
	if `=_by()'==1 {
		noi di in yellow "no observations when variable = something"
	}
	else {
		* `=_by()'~=1, not running by( )
		*noi di in red "no observations"
		error 2000
	}
}
*/

noi di
if `"`stringList'"'~="" {
	noi di in yellow "Following variable is string, not included:  "
	foreach var in `stringList' {
		noi di in yellow "`var'  " _c
	}
	di
}
if `"`noobsList'"'~="" {
	noi di in yellow "Following variable has no observation, not included:  "
	foreach var in `noobsList' {
		noi di in yellow "`var'  " _c
	}
	di
}

} /* qui */
end /* sum2 */


********************************************************************************************


* regList Jan2009 by roywada@hotmail.com
* regList Jun2009 by roywada@hotmail.com verion 7 added
* 28mar2010 [pw aw fw iw] added but ignored

prog define regList, rclass
* get the name of equations and variables used in e(b)
	versionSet
	version `version'
	
	* [if] [in] ignored:
	syntax [varlist(default=none)] [if] [in] [pw aw fw iw] [, NODEPendent *]
	
	* separate potential equation names from variable names
	tempname b b_transpose
	mat `b'=e(b)
	mat `b_transpose' = `b''
	local varnames : rownames(`b_transpose')
	
if "`nodependent'"~="nodependent" {
	* indep variables, but the equations names are actually dep variables
	* plus the dep var
	local eqlist "`e(depvar)' `eqlist'"
	macroUnique `eqlist', names(eqlist) number(eqnum)
	
/* not reliable because not always a dependent variable, i.e. sqreg slaps on q10, q20, etc.
	* take off numbers from the front (reg3 sometimes slaps them on)
	foreach v in `eqlist' {
		local first = substr(`"`v'"',1,1)
		local test
		cap local test = `first' * 1
		if "`test'"=="`first'" {
			* a number
			local wanted = substr(`"`v'"',2,.)
			local collect "`collect' `wanted'"
		}
		else {
			local collect "`collect' `v'"
		}
	}
	local eqlist `collect'
	macroUnique `eqlist', names(eqlist) number(eqnum)
	
	* repeat
	foreach v in `eqlist' {
		local first = substr(`"`v'"',1,1)
		local test
		cap local test = `first' * 1
		if "`test'"=="`first'" {
			* a number
			local wanted = substr(`"`v'"',2,.)
			local collect "`collect' `wanted'"
		}
		else {
			local collect "`collect' `v'"
		}
	}
	local eqlist `collect'
*/
	
	macroUnique `eqlist', names(eqlist) number(eqnum)
}
	macroUnique `eqlist', names(eqlist) number(eqnum)
	macroMinus `varnames', names(varlist) number(varnum) subtract(_cons)
	macroUnique `varlist', names(varlist) number(varnum)
	
	return local eqlist `eqlist'
	return local eqnum `eqnum'
	return local varlist `varlist'
	return local varnum `varnum'
	
end /* regList */


********************************************************************************************


* macroUnique Jan2009 by roywada@hotmail.com
* macroUnique Jun2009 by roywada@hotmail.com version 7 added
prog define macroUnique

* gets you unique macro names & number of them (both c_locals)
* could be empty

version 7.0

syntax [anything], names(string) [number(string)]
	local collect ""
	* just holding the place until the loop
	local temp1: word 1 of `anything' 
	local temp2: word 2 of `anything'
	
	local total: word count `anything'
	local cc 1
	local same ""
	while "`temp1'"~="" {
		local temp1: word `cc' of `anything'
		local same ""
		*di "try `temp1' at `cc'"
		local kk=`cc'+1
		local temp2: word `kk' of `anything'
		while "`temp2'"~="" & "`same'"=="" {
			if "`temp1'"=="`temp2'" {
 				*di "`cc' is same as `kk'"
				local same same
			}
			else {
				local kk=`kk'+1
			}
			local temp2: word `kk' of `anything'
		}
		if "`temp1'"~="" & "`temp2'"=="" & "`same'"~="same" {
			*di "accept `temp1' at `cc' before " _c
			local collect "`collect' `temp1'"
		}
		*di "reject `temp1' at `cc'"
		local cc=`cc'+1
	}
	
	c_local `names' `collect'
	if "`number'"~="" {
		c_local `number' : word count `collect'
	}
end


********************************************************************************************


* macroMinus Jan2009 by roywada@hotmail.com
* macroMinus Jun2009 by roywada@hotmail.com version 7 added
prog define macroMinus

version 7.0

* gets you macro names subtracted & number of them (both c_locals)
* could be empty

syntax [anything], names(string) [number(string asis) subtract(string)]
	local collect ""
	* just holding until the loop
	local temp1: word 1 of `anything' 
	local temp2: word 1 of `subtract'
	
	local total: word count `anything'
	local cc 1
	local same ""
	while "`temp1'"~="" {
		local temp1: word `cc' of `anything'
		local same ""
		*di "try `temp1' at `cc'"
		local kk=1
		local temp2: word `kk' of `subtract'
		while "`temp2'"~="" & "`same'"=="" {
			if "`temp1'"=="`temp2'" {
 				*di "`temp1' is same as `temp2'"
				local same same
			}
			else {
				local kk=`kk'+1
			}
			local temp2: word `kk' of `subtract'
		}
		if "`temp1'"~="" & "`temp2'"=="" & "`same'"~="same" {
			*di "accept `temp1' at `cc' before " _c
			local collect "`collect' `temp1'"
		}
		*di "reject `temp1' at `cc'"
		local cc=`cc'+1
	}
	
	c_local `names' `collect'
	if "`number'"~="" {
		c_local `number' : word count `collect'
	}

end


********************************************************************************************


* Jun2009 version 7 added
* 23mar2010 labelA(insert upper lower proper)

prog define cleanFile
* split possible eqnames from varnames
* gets labels
* get titles
* c_locals titleWide headRow bottomRow

	versionSet
	version `version'

syntax using [, noQUOte comma title(string) label labelOption(string) /*
	*/ titlefile(string) NOTITLE slow(numlist)]
		
		* get c_locals returned from labelOption
		optionSyntax, valid(insert upper lower proper) name(labelA) nameShow(label( )) content(`labelOption')
		
		*** get the label names
		if "`label'"=="label" | "`insert'"=="insert" {
			tempfile labelfile
			
			* extender making sure the obs > columns
			local N=_N
			describe, short
			if `r(k)'>`N'+1 & `r(k)'<. {
				set obs `r(k)'
			}
			
			gen str8 var1=""
			gen str8 labels=""
			unab varlist_all : *
			cap unab subtract: _est_*
			*cap local varlist_only : list varlist_all - subtract
			macroMinus `varlist_all', names(varlist_only) subtract(`subtract')
			local count=1
			foreach var in `varlist_only' {
				local lab ""
				cap local lab: var label `var'
				local lab=trim("`lab'")
				if "`lab'"~="" {
					replace var1="`var'" in `count'
					replace labels="`lab'" in `count'
					local count=`count'+1
				}
			}
			keep var1 labels
			
			drop if var1==""
			
			* indicate no label contained
			local N=_N
			if `N'==0 {
				local emptyLabel=1
			}
			else {
				local emptyLabel=0
			}
			
			* add constant
			local newN=_N+1
			set obs `newN'
			
			local N=_N
			replace labels="Constant" in `N'
			replace var1="Constant" in `N'
			
			* letter cases
			if "`upper'"=="upper" {
				replace labels=upper(labels)
			}
			if "`lower'"=="lower" {
				replace labels=lower(labels)
			}
			if "`proper'"=="proper" {
				replace labels=proper(labels)
			}
			
			save `"`labelfile'"'
		}
		
		
		
		*** clean up equation names, title, label
		sleep `slow'	/* wait 1000 ms = 1 second before trying again */
		insheet `using', nonames clear
		tempvar id1 id2 id3 id4
		
		
		*** bottom row (the bottom border), count up
		gen rowmiss=0
		foreach var of varlist v* {
			replace rowmiss=rowmiss+1 if `var'~=""
		}
		local N=_N
		local content 1
		local num 0
		while `content'==1 & `num'<`N' {
			local content rowmiss[`=`N'-`num'']
			local num=`num'+1
		}
		* add titleWide and eqAdded later to get bottomBorder
		local bottomRow = `N'-`num'+1
		
		
		*** head row (the head border), count down
		local content
		local num 1
		local N=_N
		while `"`content'"'=="" & `num'<=`N' {
			local content=v1[`num']
			local num=`num'+1
		}
		* add titleWide later to get headBorder
		local headRow=`num'-1
		drop rowmiss
		
		
		gen id1=_n
		gen str8 equation=""
		gen str8 variable=""
		
		* find the top & bottom empty row
		gen rowmiss=0
		foreach var of varlist v* {
			replace rowmiss=rowmiss+1 if `var'~=""
		}
		
		
		* take care if colon (:) that may appears in the notes by limiting the search to the above
		local N=_N
		local stuff=rowmiss[`N']
		local cc 0
		while `stuff'~=0 {
			local stuff=rowmiss[`N'-`cc']
			local cc=`cc'+1
		}
		
		********** this should be made faster in version 10
		forval num=1/`=`N'-`cc'' {
			local name=trim(v1[`num'])
			local column=index("`name'",":")
			if `column'~=0 {
				local equation=trim(substr("`name'",1,`column'-1))
				local variable=trim(substr("`name'",`column'+1,length("`name'")))
				replace equation="`equation'" in `num'
				replace variable="`variable'" in `num'
			}
		}
				
		replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & rowmiss~=0
		*replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & v1~="Observations"
		
		* needs a workaround for blank inserted by user
		gen str8 temp=""
		replace temp=equation
		replace temp=temp[_n-1] if temp[_n-1]~="" & temp[_n-1]~="." & temp==""
		gen str8 top="1" if temp[_n]~=temp[_n-1] & temp[_n]~=""
		drop temp
		
		
		* now only the top empty row
		replace rowmiss=0 if rowmiss[_n-1]==0
		
		count if equation~=""
		if `r(N)'~=0 {
			* move equation names, instead of inserting them
			count if v1=="EQUATION"
			if `r(N)'==0 {
				gen str8 v0=""
				replace v0=equation
				replace v0="EQUATION" in `headRow'
				order v0
				replace v1=variable if variable~=""
			}
			else {
				replace v1=equation
				replace v1="EQUATION" in `headRow'
			}
		}
		drop rowmiss
		
		* strips the redundant equation names
		* must be undone at the insheet that recall this file in appendFile
		
		count if equation~=""
		if `r(N)'~=0 {
			*** for one column option
			replace v0="" if top=="" & v0~="EQUATION"
		}
		
		drop id1 equation variable        top
		sleep `slow'	/* wait 1000 ms = 1 second before trying again */
		outsheet `using', nonames `quote' `comma' replace
		
		
		
		*** clean up labels
		if "`label'"=="label" | "`insert'"=="insert" {
			
			ren v1 var1
			gen `id2'=_n
			
			* skip merging process if no label was contained
			if `emptyLabel'==1 {
				gen str8 labels=""
			}
			else {
				joinby var1 using `"`labelfile'"', unmatched(master)
				drop _merge
			}
			
			sort `id2'
			drop `id2'
			order var1 labels
			cap order v0 var1 labels
			
			replace labels="LABELS" in `headRow'
			ren var1 v1
		}
		
		
		
		*** (re)attaches titles
	if "`notitle'"=="" {
		if `"`title'"'=="" {
			* NOTE: v0- saved here
			tempfile appending
			tempvar tomato potato
			gen `tomato' =_n+10000
			save `"`appending'"',replace
			
			*** Clean up titles
			* just coef, no label, no equation
			cap confirm file `titlefile'
			if !_rc {
				use `titlefile',clear
				
				*gen `id3'=1 if v1=="VARIABLES"
				*gen `id3'=1 if v1==`"`VARIABLES1'"'
				* find the top empty row
				gen rowmiss=0
				foreach var of varlist v* {
					replace rowmiss=rowmiss+1 if `var'~=""
				}
				replace rowmiss=0 if rowmiss[_n-1]==0
				
				gen `id3'=1 if rowmiss[_n+1]==0
				replace `id3'=1 if `id3'[_n-1]==1
				
				drop rowmiss
				drop if `id3'==1
				keep if v1~=""
				
				local N=_N
				if `N'~=0 {
					keep v1
					gen `potato'=_n
					local titleWide=_N
					joinby v1 using `"`appending'"', unmatched(both)
					sort `potato' `tomato'
					drop _merge `potato' `tomato'
					aorder
				}
				else {
					use `"`appending'"',replace
					drop `tomato'
				}
			}
			cap drop `tomato'
			
			* reorder again
			cap order v1 labels
			cap order v0 v1 labels
		}
		else {
			* parse title
			partxtl2 `"`title'"'
			local titleWide = `r(numtxt)'
			local t = 1
			while `t'<=`titleWide' {
				local titl`t' `r(txt`t')'
				local t = `t'+1
			}
			
			local oldN=_N
			set obs `=`r(numtxt)'+_N'
			gen `id4'=_n+10000
			forval num=1/`r(numtxt)' {
				replace v1="`r(txt`num')'" in `=`oldN'+`num''
				replace `id4'=`num' in `=`oldN'+`num''
			}
			sort `id4'
			drop `id4'
		}
		
		if "`titleWide'"=="" {
			local titleWide=0
		}
	}
		
		* problem spot
		sleep `slow'	/* wait 1000 ms = 1 second before trying again */
		outsheet `using', nonames `quote' `comma' replace
		
		c_local bottomRow `bottomRow'
		c_local headRow `headRow'
		c_local titleWide `titleWide'
		
end /* cleanFile */


********************************************************************************************


* chewfile version 1.0.1 17Aug2009 by roywada@hotmail.com
* borrowed on 17Aug2009
prog define _chewfile
version 8.0

syntax using/, [save(string) begin(numlist max=1) end(string) clear parse(string) replace semiclear]

if `"`parse'"'=="" {
	local parse `"`=char(9)'"'
}

if "`begin'"=="" {
	local begin 1
}

if "`end'"=="" {
	local end .
}

if "`clear'"=="" & `"`save'"'=="" {
	if "`semiclear'"=="" {
		noi di in red "must specify {opt clear} or {opt save( )}
		exit 198
	}
}

if "`semiclear'"=="semiclear" {
	qui drop *
	qui set obs 0
}
else if "`clear'"=="clear" {
	clear
	qui set obs 0
}

if `"`save'"'=="" {
	tempfile dump
	local save `dump'
}

tempname fh outout
local linenum = 0
file open `fh' using `"`using'"', read

qui file open `outout' using `"`save'"', write `replace'

file read `fh' line

while r(eof)==0 {
	local linenum = `linenum' + 1
	local addedRow 0
	if `linenum'>=`begin' & `linenum'<=`end' {
		if `addedRow'==0 {
			qui set obs `=`=_N'+1'
		}
		
		*display %4.0f `linenum' _asis `"`macval(line)'"'
		file write `outout' `"`macval(line)'"' _n
		
		if "`clear'"=="clear" | "`semiclear'"=="semiclear" {
			tokenize `"`macval(line)'"', parse(`"`parse'"')
			local num 1
			local colnum 1
			while "``num''"~="" {
				local needOneMore 0
				if `"``num''"'~=`"`parse'"' {
					cap gen str3 var`colnum'=""
					cap replace var`colnum'="``num''" in `linenum'
					if _rc~=0 {
						qui set obs `=`=_N'+1'
						cap replace var`colnum'="``num''" in `linenum'
						local addedRow 1
					}
					*local colnum=`colnum'+1
				}
				else {
					cap gen str3 var`colnum'=""
					local colnum=`colnum'+1
				}
				local num=`num'+1
			}
		}
	}
	file read `fh' line
}

file close `fh'
file close `outout'
end


********************************************************************************************


* cdout 1.0.1 Apr2009 by roywada@hotmail.com
* opens the current directory for your viewing pleasure

* the following disabled 14oct2009: cap winexec cmd /c start .
* modified on 21oct2009:
*	displays "dir" instead of cdout or the folder location
*	cont option

prog define _cdout
cap version 7.0

syntax, [cont]

if "`cont'"=="cont" {
	local _c "_c"
}


*cap winexec cmd /c start .
*cap !start cmd /c start .

if _rc~=0 {
        * version 6 or earlier
        di `"{stata `"cdout"':dir}"' `_c'
}
else {
        * invisible to Stata 7
        local Version7
        local Version7 `c(stata_version)'
        
        if "`Version7'"=="" {
                * it is version 7 or earlier
                di `"{stata `"cdout"':dir}"' `_c'
        }
        else if `Version7'>=8.0 {
                version 8.0
                di `"{browse `"`c(pwd)'"' :dir}"' `_c'
        }
}

if "`cont'"=="cont" {
	di in white `" : "' _c
}

end


********************************************************************************************


* oct2009
* parse tex( ) options
prog define _texout_parse
	version 7
	syntax, [FRagment NOPRetty PRetty Landscape]
	c_local texopts "`fragment' `nopretty' `pretty' `landscape'"
end


********************************************************************************************


* oct2009
* parse stats( ) options
prog define _stats_check
	
	* note: it will not prevent illegal options from entering (dumped into * `options') & allows multiple entry to be handled
	* note: must be all lower case
	
	version 7
	
	syntax, [eqname varname label label_pr label_up label_low coef se tstat pval ci aster blank beta ci_low ci_high /*
		*/ n sum_w mean var sd SKEWness KURTosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b *]
	
	c_local sumAsked ""
	if `"`n'`sum_w'`mean'`var'`sd'`min'`max'`sum'"'~="" {
		c_local sumAsked regular
	}
	if `"`skewness'`kurtosis'`p1'`p5'`p10'`p25'`p50'`p75'`p90'`p95'`p99'`range'`cv'`semean'`median'`count'"'~="" {
		c_local sumAsked detail
	}
	if `"`cv'`range'`iqr'`semean'`median'`count'"'~="" {
		c_local sumAsked extra
	}
	
	foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b {
		c_local `var'Asked ""
		if `"``var''"'~="" {
			c_local `var'Asked `var'
		}
	}
	
	foreach var in eqname varname label label_pr label_up label_low {
		c_local `var'Asked ""
		if `"``var''"'~="" {
			c_local `var'Asked `var'
		}
	}
end


********************************************************************************************


* oct2009
* 05apr2010 added mat( ) and e( )
* parse cmd( ), str( ), and r( ) from the contents of stats( ) option
prog define _stats_parse
	
	version 7
	
	syntax, [cmd(str asis) str(str asis) r(str asis) Mat(str asis) e(str asis)]
	
end


********************************************************************************************


* 03nov2009
* 28jan2010 for version 11 fv
prog define versionSet
	* sends back the version as c_local
	version 7.0
	
	* invisible to Stata 7
	cap local Version7 `c(stata_version)'
	c_local Version7 `Version7'
	
	* a_version is the actual version number with a floor of 7
	if "`Version7'"=="" {
		* it is version 7
		c_local version 7
		c_local a_version 7
	}
	else {
		c_local a_version `Version7'
		if `Version7'>=8.2 {
			version 8.2
			c_local version 8.2
		}
	}
	
	if "`Version7'"=="" {
		c_local bind ""
	}
	else {
		c_local bind "bind"
	}
end


********************************************************************************************


* 15nov2009
prog define eretSet, eclass
	versionSet
	version `version'
	
	syntax varlist
	cap reg `varlist'
	if _rc==0 {
		marksample touse
		tempname ebmat eVmat
		
		mat `ebmat'=e(b)
		mat `eVmat'=e(V)
		
		gettoken depvar rest: varlist
		
		if "`Version7'"=="" {
			est mat b `ebmat'
			est mat V `eVmat'
			
			count if `touse'==1
			est scalar N = r(N)
		}
		else {
			tempvar sample
			local N=e(N)
			local depvar=e(depvar)
			gen `sample'=e(sample)
			eret clear
			eret post `ebmat' `eVmat', e(`sample')
			eret local depvar `"`depvar'"'
			eret scalar N = `N'
		}
	}
end


********************************************************************************************


* cloned 20nov2009
* pcorr2 version 1.1
* Adapted by Richard Williams from pcorr2 version 2.2.8  08sep2000
* Last Modified 14Feb2004
prog define pcorr, rclass
        version 6
        syntax varlist(min=2) [aw fw] [if] [in]
        marksample touse
	gettoken dep indep: varlist
	regList
	* will be redundant
	macroMinus `r(varlist)', names(temp) subtract(`dep' `indep')
        local weight "[`weight'`exp']"
        quietly reg `dep' `indep' `temp' `weight' if `touse'
        if (e(N)==0 | e(N)==.) { error 2000 }
        local NmK = e(df_r)
                quietly test `indep'
                local s "1"
                if (_b[`indep']<0) { local s "-1" }
                ret scalar pcorr=`=`s'*sqrt(r(F)/(r(F)+`NmK'))'
                ret scalar semipcorr=`=`s'*sqrt(r(F)* ((1-e(r2))/`NmK'))'
                *ret scalar pcorr2=`=(r(F)/(r(F)+`NmK'))'
                *ret scalar semipcorr2=`=(r(F)* ((1-e(r2))/`NmK'))'
                ret scalar pcorrpval=`=tprob(`NmK',sqrt(r(F)))'
end

prog define semipcorr, rclass
        version 6
        syntax varlist(min=2) [aw fw] [if] [in]
        marksample touse
	gettoken dep indep: varlist
	regList
	* will be redundant
	macroMinus `r(varlist)', names(temp) subtract(`dep' `indep')
        local weight "[`weight'`exp']"
        qui reg `dep' `indep' `temp' `weight' if `touse'
        if (e(N)==0 | e(N)==.) { error 2000 }
        local NmK = e(df_r)
                quietly test `indep'
                local s "1"
                if (_b[`indep']<0) { local s "-1" }
                ret scalar pcorr=`=`s'*sqrt(r(F)/(r(F)+`NmK'))'
                ret scalar semipcorr=`=`s'*sqrt(r(F)* ((1-e(r2))/`NmK'))'
                *ret scalar pcorr2=`=(r(F)/(r(F)+`NmK'))'
                *ret scalar semipcorr2=`=(r(F)* ((1-e(r2))/`NmK'))'
                ret scalar pcorrpval=`=tprob(`NmK',sqrt(r(F)))'
end

prog define pcorrpval, rclass
        version 6
        syntax varlist(min=2) [aw fw] [if] [in]
        marksample touse
	gettoken dep indep: varlist
	regList
	* will be redundant
	macroMinus `r(varlist)', names(temp) subtract(`dep' `indep')
        local weight "[`weight'`exp']"
        quietly reg `dep' `indep' `temp' `weight' if `touse'
        if (e(N)==0 | e(N)==.) { error 2000 }
        local NmK = e(df_r)
                quietly test `indep'
                local s "1"
                if (_b[`indep']<0) { local s "-1" }
                ret scalar pcorr=`=`s'*sqrt(r(F)/(r(F)+`NmK'))'
                ret scalar semipcorr=`=`s'*sqrt(r(F)* ((1-e(r2))/`NmK'))'
                *ret scalar pcorr2=`=(r(F)/(r(F)+`NmK'))'
                *ret scalar semipcorr2=`=(r(F)* ((1-e(r2))/`NmK'))'
                ret scalar pcorrpval=`=tprob(`NmK',sqrt(r(F)))'
end


********************************************************************************************


* 27nov2009
prog define tau_a, rclass
        version 6
	* weight ignored
        syntax varlist(min=2) [pw aw fw iw] [if] [in]
        marksample touse
	gettoken dep indep: varlist
	ktau `dep' `indep'
	ret scalar tau_a=`r(tau_a)'
end

prog define tau_b, rclass
        version 6
	* weight ignored
        syntax varlist(min=2) [pw aw fw iw] [if] [in]
        marksample touse
	gettoken dep indep: varlist
	ktau `dep' `indep'
	ret scalar tau_b=`r(tau_b)'
end


********************************************************************************************


* 29mar2010
*************** cap to avoid constant, could use equation name as the label for constant
prog define label, rclass
	* weight ignored, no need for touse
        syntax varlist(min=2) [pw aw fw iw] [if] [in]
	gettoken dep indep: varlist
	cap local temp : var label `indep'
	ret local label=`"`temp'"'
end

prog define label_pr, rclass
	* weight ignored, no need for touse
        syntax varlist(min=2) [pw aw fw iw] [if] [in]
	gettoken dep indep: varlist
	cap local temp : var label `indep'
	local temp=proper(`"`temp'"')
	ret local label_pr=`"`temp'"'
end

prog define label_up, rclass
	* weight ignored, no need for touse
        syntax varlist(min=2) [pw aw fw iw] [if] [in]
	gettoken dep indep: varlist
	cap local temp : var label `indep'
	local temp=upper(`"`temp'"')
	ret local label_up=`"`temp'"'
end

prog define label_low, rclass
	* weight ignored, no need for touse
        syntax varlist(min=2) [pw aw fw iw] [if] [in]
	gettoken dep indep: varlist
	cap local temp : var label `indep'
	local temp=lower(`"`temp'"')
	ret local label_low=`"`temp'"'
end


********************************************************************************************


* 21nov2009
* concatenate variables into one string variable
prog define concat
	version 7
	syntax, input(str)
	givetoken, input(`input') clocal(concat) parse(",")
	local num 1
	tempvar temp1
	while "`concat`num''"~="" {
		givetoken, input(`concat`=`num'+1'') clocal(varname) parse("+")
		local nn 1
		while "`varname`nn''"~="" {
			*di `"`varname`nn''"'
			*di `"`varname`=`nn'+1''"'
			cap gen str7 `temp1'=""
			cap replace `temp1'=string(`varname`nn'')
			if _rc==0 {
				move `temp1' `varname`nn''
				drop `varname`nn''
				ren `temp1' `varname`nn''
			}
			local nn=`nn'+1
		}
		*di
		gen str7 `concat`num''=""
		replace `concat`num''=`concat`=`num'+1''
		local num=`num'+2
	}
end


********************************************************************************************


* 21nov2009
* gettoken-based parser
prog define givetoken
	* parse will take only one character
	version 7
	syntax, input(str) clocal(str) [parse(str)]
	local num 1
	if `"`parse'"'=="" {
		local parse " "
		gettoken one two : input, parse("`parse'")
		c_local `clocal'`num' `"`one'"'
		while `"`two'"'~="" {
			local num=`num'+1
			*gettoken one two : two, parse("`parse'")
			gettoken one two : two, parse("`parse'")
			c_local `clocal'`num' `"`one'"'
		}
	}
	else {
		gettoken one two : input, parse("`parse'")
		c_local `clocal'`num' `"`one'"'
		while `"`two'"'~="" {
			local num=`num'+1
			gettoken one two : two, parse("`parse'")
			gettoken one two : two, parse("`parse'")
			c_local `clocal'`num' `"`one'"'
		}
	}
end


********************************************************************************************


* 25nov2009 calculates covariance
prog define covar, rclass
	syntax varlist(max=2) [if]
	gettoken dep indep : varlist
	qui sum `dep' `if'
	local sdy `r(sd)'
	qui sum `indep' `if'
	local sdx `r(sd)'
	corr `dep' `indep' `if'
	*c_local covar `=`r(rho)'*`sdy'*`sdx''
	ret local covar `=`r(rho)'*`sdy'*`sdx''
end


********************************************************************************************

exit




sysuse auto, clear
concat, input(one, make + price)

prog define outreg2, by(onecall) sortpreserve
prog define outreg2_by, by(recall, nohead)
prog define _outreg2
prog define appendFile
prog define marginal2
prog define partxtl2, rclass
prog define partxtl3, rclass
prog define makeFile
prog define seeing
prog define fmtgen
prog define autogen
prog define autodigits2, rclass
prog define autofmt, rclass
prog define _texout, sortpreserve
prog define out2rtf2, sortpreserve rclass
prog define _xmlout
prog define xmlstack
prog define dsCol
prog define ds8
prog define _tab3, eclass
prog define optionSyntax
prog define _sum2, eclass
prog define regList, rclass
prog define macroUnique
prog define macroMinus
prog define cleanFile
prog define _chewfile
prog define _cdout
prog define _stats_parse
prog define versionSet
prog define eretSet, eclass
prog define pcorr, rclass
prog define concat
prog define givetoken





fixed varname VarName1 that was previously unambiguated (sortvar)




eqName into eqname
varlist fv is fixed
wide option for those who doesn't read the help file; ologit and oprobit forced as long
stats(eqname)




to do:
inddrop need (1) unabmiguate (2) multiple groups
need to set the correct version for prefix operations
!textify
machine readable









